使用sklearn模型時我有點困惑,我該如何設置特定的優化功能?例如,當使用RandomForestClassifier時,如何讓模型「知道」我想要最大化「回憶」或「F1分數」。或'AUC'而不是'準確性'?專門針對誤報的二元分類目標
有什麼建議嗎?謝謝。
使用sklearn模型時我有點困惑,我該如何設置特定的優化功能?例如,當使用RandomForestClassifier時,如何讓模型「知道」我想要最大化「回憶」或「F1分數」。或'AUC'而不是'準確性'?專門針對誤報的二元分類目標
有什麼建議嗎?謝謝。
你在找什麼是Parameter Tuning。基本上,首先你選擇一個估計器,然後定義一個超參數空間(即所有可能的參數和你想要調整的它們各自的值),一個交叉驗證方案和評分函數。現在,根據您選擇的搜索參數的空間,您可以選擇以下:
詳盡的網格搜索 在這種方法中,sklearn創建使用用戶定義的超放慢參數值的所有可能組合的網格GridSearchCV方法。例如,:
my_clf = DecisionTreeClassifier(random_state=0,class_weight='balanced')
param_grid = dict(
classifier__min_samples_split=[5,7,9,11],
classifier__max_leaf_nodes =[50,60,70,80],
classifier__max_depth = [1,3,5,7,9]
)
在這種情況下,指定的網格是classifier__min_samples_split,classifier__max_leaf_nodes和classifier__max_depth值的交叉乘積。該文檔指出:
GridSearchCV實例實現通常的估計器API:當將它「擬合」到數據集上時,將評估所有可能的參數值組合,並保留最佳組合。
使用GridSearch一個例子:
#Create a classifier
clf = LogisticRegression(random_state = 0)
#Cross-validate the dataset
cv=StratifiedKFold(n_splits=n_splits).split(features,labels)
#Declare the hyper-parameter grid
param_grid = dict(
classifier__tol=[1.0,0.1,0.01,0.001],
classifier__C = np.power([10.0]*5,list(xrange(-3,2))).tolist(),
classifier__solver =['newton-cg', 'lbfgs', 'liblinear', 'sag'],
)
#Perform grid search using the classifier,parameter grid, scoring function and the cross-validated dataset
grid_search = GridSearchCV(clf, param_grid=param_grid, verbose=10,scoring=make_scorer(f1_score),cv=list(cv))
grid_search.fit(features.values,labels.values)
#To get the best score using the specified scoring function use the following
print grid_search.best_score_
#Similarly to get the best estimator
best_clf = grid_logistic.best_estimator_
print best_clf
你可以閱讀更多關於它的文檔here瞭解各種內部方法等來獲取最佳的參數等
隨機搜索 而不是徹底檢查超參數空間,sklearn實施RandomizedSearchCV做參數的隨機搜索。該文檔指出:
RandomizedSearchCV實現隨機搜索參數,其中每個設置都是從可能的參數值的分佈中採樣。
您可以從here瞭解更多關於它的信息。
您可以閱讀更多關於其他方法here。
替代鏈接以供參考:
編輯:在你的情況,如果你想最大化召回的型號,你只需從sklearn.metrics中指定recall_score作爲評分功能。
如果您希望最大化您的問題所述的'假陽性',可以參考this answer從confusion matrix中提取'假陽性'。然後使用make scorer函數並將其傳遞給GridSearchCV對象進行調優。
謝謝。我意識到參數調整以獲得最佳結果,但我更多地討論模型自身的優化功能,無論如何要改變它們? – user6396
@ user6396根據你的問題,你想根據你指定的評分函數來優化你的模型嗎?如果是這種情況,那麼這就是上述sklearn的參數調整模塊中發生的確切事情。還有什麼我失蹤的? –
我已經更新了我的回答,請讓我知道它是否回答您的問題? –
我建議你搶一杯咖啡,讀(和理解)以下
http://scikit-learn.org/stable/modules/model_evaluation.html
你需要沿着
線cross_val_score(model, X, y, scoring='f1')
可能的選擇是使用的東西(檢查文檔)
['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score',
'average_precision', 'completeness_score', 'explained_variance',
'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted',
'fowlkes_mallows_score', 'homogeneity_score', 'mutual_info_score',
'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_squared_error',
'neg_mean_squared_log_error', 'neg_median_absolute_error',
'normalized_mutual_info_score', 'precision', 'precision_macro',
'precision_micro', 'precision_samples', 'precision_weighted', 'r2',
'recall', 'recall_macro', 'recall_micro', 'recall_samples',
'recall_weighted', 'roc_auc', 'v_measure_score']
玩得開心 翁貝託
我不認爲這實際上回答了這個問題。這隻涉及模型的*評估*。不是模型的**優化**。 – Andnp
由於某種原因存在不同的分類器,每個分類器都經過訓練以最大化不同的優化功能。例如,在RandomForest中,每個節點都被*貪婪地訓練*來分裂和最大化兒童的基尼標準(或熵標籤)的信息增益。因此,1)RandomForest不直接最大化精度,2)*記憶*或* F1分數*不是您訓練模型的衡量標準,是評估不同的已經訓練過的模型的衡量標準。你總是可以設計分類器的變體來最大限度地提高這些分數,但並不是所有分數都能做到。 –
@ImanolLuengo。你爲我清理了很多東西。您能否指出我如何「設計分類器的變體以最大化某些分數」的例子之一?謝謝。你對使用基尼或熵的隨機森林是正確的。其他模型呢?如邏輯迴歸(使用最大可能性我想)或SVM或LDA。有沒有一種方法來指定不同的優化功能? – user6396
不是直接的,也不是一個簡單的方法,你將不得不數學重新分類器的優化功能,爲你的分數引入懲罰(並非總是可能),然後對其進行編碼。正如@MohammedKashif在他的回答中所說的那樣,實現它的最簡單方法是訓練幾個具有不同參數的模型,並保留在您的指標中達到最高分數的模型。 –