「scikit Learnで機械学習をマスターする」という本から抜粋した例を使用しています。
決定木を使用して、Web ページ上の各画像が広告または記事のコンテンツであるかどうかを予測します。広告として分類された画像は、カスケーディング スタイル シートを使用して非表示にすることができます。このデータは、インターネット広告データ セット ( http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements )から公開されており、3,279 枚の画像のデータが含まれています。
以下は、分類タスクを完了するための完全なコードです。
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
import sys,random
def main(argv):
df = pd.read_csv('ad-dataset/ad.data', header=None)
explanatory_variable_columns = set(df.columns.values)
response_variable_column = df[len(df.columns.values)-1]
explanatory_variable_columns.remove(len(df.columns.values)-1)
y = [1 if e == 'ad.' else 0 for e in response_variable_column]
X = df[list(explanatory_variable_columns)]
X.replace(to_replace=' *\?', value=-1, regex=True, inplace=True)
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=100000)
pipeline = Pipeline([('clf',DecisionTreeClassifier(criterion='entropy',random_state=20000))])
parameters = {
'clf__max_depth': (150, 155, 160),
'clf__min_samples_split': (1, 2, 3),
'clf__min_samples_leaf': (1, 2, 3)
}
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1,verbose=1, scoring='f1')
grid_search.fit(X_train, y_train)
print 'Best score: %0.3f' % grid_search.best_score_
print 'Best parameters set:'
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print '\t%s: %r' % (param_name, best_parameters[param_name])
predictions = grid_search.predict(X_test)
print classification_report(y_test, predictions)
if __name__ == '__main__':
main(sys.argv[1:])
例のように GridSearchCV で score ='f1'を使用した結果は次のとおりです。
Scoring =None (デフォルトでは Accuracy メジャー) を使用した場合の結果は、F1 スコアを使用した場合と同じです。
私が間違っていなければ、さまざまなスコアリング関数でパラメーター検索を最適化すると、さまざまな結果が得られるはずです。次のケースは、 scoring='precision'を使用すると異なる結果が得られることを示しています。
Scoring ='precision'を使用した結果は、他の 2 つのケースとは異なります。同じことが「recall」などにも当てはまります。
なぜ 'F1' と None がデフォルトの精度で同じ結果になるのですか??
編集済み
ファビアンとセバスチャンの両方の回答に同意します。問題は、param_grid が小さいことです。しかし、まったく異なる (ここの例ではなく) 非常に不均衡な 100:1 データセット (精度に影響するはずです) を使用し、ロジスティック回帰を使用しているときに、問題が急増したことを明確にしたかっただけです。この場合、「F1」と精度でも同じ結果が得られました。
この場合に使用した param_grid は次のとおりです。
parameters = {"penalty": ("l1", "l2"),
"C": (0.001, 0.01, 0.1, 1, 10, 100),
"solver": ("newton-cg", "lbfgs", "liblinear"),
"class_weight":[{0:4}],
}
パラメータの選択も小さすぎると思います。