1

使用sklearn模型時我有點困惑,我該如何設置特定的優化功能?例如,當使用RandomForestClassifier時,如何讓模型「知道」我想要最大化「回憶」或「F1分數」。或'AUC'而不是'準確性'?專門針對誤報的二元分類目標

有什麼建議嗎?謝謝。

+2

由於某種原因存在不同的分類器,每個分類器都經過訓練以最大化不同的優化功能。例如,在RandomForest中,每個節點都被*貪婪地訓練*來分裂和最大化兒童的基尼標準(或熵標籤)的信息增益。因此,1)RandomForest不直接最大化精度,2)*記憶*或* F1分數*不是您訓練模型的衡量標準,是評估不同的已經訓練過的模型的衡量標準。你總是可以設計分類器的變體來最大限度地提高這些分數,但並不是所有分數都能做到。 –

+0

@ImanolLuengo。你爲我清理了很多東西。您能否指出我如何「設計分類器的變體以最大化某些分數」的例子之一?謝謝。你對使用基尼或熵的隨機森林是正確的。其他模型呢?如邏輯迴歸(使用最大可能性我想)或SVM或LDA。有沒有一種方法來指定不同的優化功能? – user6396

+0

不是直接的,也不是一個簡單的方法,你將不得不數學重新分類器的優化功能,爲你的分數引入懲罰(並非總是可能),然後對其進行編碼。正如@MohammedKashif在他的回答中所說的那樣,實現它的最簡單方法是訓練幾個具有不同參數的模型,並保留在您的指標中達到最高分數的模型。 –

回答

2

你在找什麼是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 answerconfusion matrix中提取'假陽性'。然後使用make scorer函數並將其傳遞給GridSearchCV對象進行調優。

+0

謝謝。我意識到參數調整以獲得最佳結果,但我更多地討論模型自身的優化功能,無論如何要改變它們? – user6396

+0

@ user6396根據你的問題,你想根據你指定的評分函數來優化你的模型嗎?如果是這種情況,那麼這就是上述sklearn的參數調整模塊中發生的確切事情。還有什麼我失蹤的? –

+0

我已經更新了我的回答,請讓我知道它是否回答您的問題? –

-2

我建議你搶一杯咖啡,讀(和理解)以下

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'] 

玩得開心 翁貝託

+0

我不認爲這實際上回答了這個問題。這隻涉及模型的*評估*。不是模型的**優化**。 – Andnp