特徴量選択の方法
後で手を加えやすいように
「標準化」→「特徴選択」→「次元圧縮」→「学習」
の流れで解析しやすいパイプラインを作ってみました。
その結果、
RFE > SelectFromModel
RandomForestClassifier > GradientBoostingClassifier
が特徴選択において有用という感じになったようです。
SVCの方面のパラメータ調整は厳密には行なっていないですが、解き方の一例として進捗を共有します。
また、どうやらこのスクリプトから出る交差検証における平均のAccuracyよりも、テストデータでのAccuracyの方が2%も高かったのが気になります... 意外とアテにならないものですね。
このような解析における汎化性能の評価方法、知ってる方がいれば共有願いたいです。
import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.svm import SVC
from sklearn.feature_selection import RFE
from sklearn.feature_selection import SelectFromModel
from sklearn.decomposition import PCA
def main():
pipe = Pipeline([('preprocessing', None), ('feature_selection', None),
("pca", None), ('classifier', None)])
param_grid = [
{
'classifier': [SVC()],
'preprocessing':[StandardScaler()],
'feature_selection': [
RFE(GradientBoostingClassifier(
learning_rate=0.01, min_samples_split=500, min_samples_leaf=17, max_depth=8,
max_features=0.3, subsample=0.8, random_state=10, n_estimators=100),
n_features_to_select=14),
SelectFromModel(GradientBoostingClassifier(
learning_rate=0.01, min_samples_split=500, min_samples_leaf=17, max_depth=8,
max_features=0.3, subsample=0.8, random_state=10, n_estimators=100),
threshold="median"),
RFE(RFC(n_estimators=20), n_features_to_select=14),
SelectFromModel(RFC(n_estimators=20), threshold="median"),
],
'classifier__gamma':[0.4],
'classifier__C':[2],
'pca': [PCA(n_components=0.8)]
}
]
gclf = GridSearchCV(pipe, param_grid, n_jobs=32, verbose=False, cv=10,
scoring='%s_weighted' % "f1")
X_train = np.loadtxt("train_data.csv", delimiter=",", skiprows=1,
usecols=[i for i in range(1, 24)])
X_test = np.loadtxt("test_data.csv", delimiter=",", skiprows=1,
usecols=[i for i in range(1, 24)])
y_train = np.loadtxt("train_data.csv", delimiter=",", skiprows=1,
usecols=(24))
first_fold = True
acc_ave = 0
epoch = 0
kf = KFold(n_splits=5)
for train_index, test_index in kf.split(X_train, y_train):
if first_fold:
gclf.fit(X_train[train_index], y_train[train_index])
clf = gclf.best_estimator_
first_fold = False
print(gclf.best_params_)
clf.fit(X_train[train_index, ], y_train[train_index])
acc = clf.score(X_train[test_index], y_train[test_index])
acc_ave = acc_ave + acc
epoch = epoch + 1
print('Accuracy: {}'.format(acc_ave/epoch))
pred = clf.predict(X_test)
submit = pd.DataFrame(
{"ID": [i for i in range(0, 3000)], "Y": pred.astype(int)})
submit.to_csv("submit.csv", index=None)
if __name__ == "__main__":
main()