2016-04-20 14 views
1

私はSVM分類器を訓練しようとしていますが、私はMLにはかなり新しいです。私はここに2つのステップがあることを知っています:パラメータのチューニングとフィーチャエンジニアリングですが、どちらが先に行くのですか? this答えが示唆されたようですフィーチャー・エンジニアリングまず、正しいですか?それが正しい場合は、SVMパラメータのセットをランダムに選択してフィーチャエンジニアリングを実行しますか?パラメータチューニングとフィーチャエンジニアリング、いずれか最初に行う必要がありますか?

答えて

1

まず、機能エンジニアリング/機能の選択を実行する必要があります。値を調整する前に、どの変数を使用するのかを知る必要があります。

どのように機能選択を行うかは、別の質問です。 Principal Component Analysis,Singular Value Decompositionなどの技術を使用できます。これは活発な研究分野です.Googleで検索するだけで、さまざまなテクニックを説明する多くの論文を見つけることができます。

Thisは、私が最近読んだ論文で、機能の選択にエントロピーベースの技術を使用しています。

0

SVM(および他のほとんどのMLメソッド)は、2次元数値フィーチャマトリックスの形式で入力を受け入れるため、SVMを使用するにもデータをそのフォーマットに変換する必要があります。だから、機能調整の前にパラメータ調整をしてパイプラインが正しく動作することを確認してください。必ずしも完全に分離する必要はありません。

自動化またはパラメータ化されたフィーチャエンジニアリングメソッドを使用する場合、そのメソッドは、ハイパーパラメータチューニングプロシージャの一部とすることができます。

Featuretoolsは、Scikit-Learnのような機械学習ライブラリと組み合わせてPythonのオープンソースの自動フィーチャエンジニアリングライブラリを使用しています。

ここでは同じ工程でハイパーパラメータチューニングや機能のエンジニアリングを行うFeaturetoolsでデモデータセットを使用してパイプラインです:

import featuretools as ft 
from featuretools.primitives import (Sum, Max, Mean, Min, 
            Percentile, Day, Weekend, Weekday) 
from featuretools.selection import remove_low_information_features 
from itertools import combinations 
from sklearn.metrics import f1_score 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.svm import SVC 
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import LabelEncoder 
from sklearn.preprocessing import StandardScaler, Imputer 


retail_data = ft.demo.load_retail(nrows=1000) 
# predict each customer's country 
labels = LabelEncoder().fit_transform(retail_data['customers'].df['Country']) 

def score_pipeline(max_depth, agg_primitives, trans_primitives, C): 
    feature_matrix, feature_defs = ft.dfs(entityset=retail_data, 
              target_entity='customers', 
              ignore_variables={'customers': ['Country']}, 
              max_depth=max_depth, 
              agg_primitives=agg_primitives, 
              trans_primitives=trans_primitives, 
              verbose=True) 
    # one-hot encode to transform to numeric 
    feature_matrix, feature_defs = ft.encode_features(feature_matrix, feature_defs) 
    # remove feature with all nans or all single value 
    feature_matrix, feature_defs = remove_low_information_features(feature_matrix, feature_defs) 
    # impute missing values 
    imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) 
    feature_matrix = imputer.fit_transform(feature_matrix) 

    model = SVC(C=C, verbose=True) 
    X_train, X_test, y_train, y_test = train_test_split(feature_matrix, 
    labels, test_size=0.1) 
    model.fit(X_train, y_train) 
    predictions = model.predict(X_test) 
    return f1_score(y_test, predictions, average='macro') 

poss_agg_primitives = [Sum, Max, Mean, Min] 
poss_trans_primitives = [Percentile, Day, Weekend, Weekday] 
scores = [] 
for agg_primitives in combinations(poss_agg_primitives, 2): 
    for trans_primitives in combinations(poss_trans_primitives, 2): 
     for max_depth in range(1, 3): 
      for C in [0.01, 0.1, 1.0]: 
       score = score_pipeline(max_depth, 
             agg_primitives, 
             trans_primitives, 
             C) 
       scores.append(score) 
print("Best score: {:.3f}".format(max(scores))) 
関連する問題