5

「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'を使用した結果は次のとおりです。

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}],
}

パラメータの選択も小さすぎると思います。

4

3 に答える 3

1

さまざまなスコアリング関数でパラメーター検索を最適化すると、必然的に異なる結果が得られることに同意しません。データセットのバランスがとれている場合 (各クラスのサンプル数がほぼ同じ)、精度によるモデル選択と F1 で非常に類似した結果が得られると予想されます。

また、GridSearchCV は離散グリッドを最適化することに注意してください。おそらく、パラメーターのより薄いグリッドを使用すると、探している結果が得られるでしょう。

于 2015-10-01T16:06:41.867 に答える
0

不均衡なデータセットでは、f1_score スコアラーの「labels」パラメーターを使用して、関心のあるクラスの f1 スコアのみを使用します。または、「sample_weight」の使用を検討してください。

于 2015-12-22T23:06:55.077 に答える