0

で折りたたみごとの特徴抽出機能選択を実行する必要があります。私は10倍のクロスバリデーションのためにトレーニングとテストセットに分裂がありません。誰かが、折りたたみごとに機能選択を行う必要があると私に言った。しかし、私はそれをどうやって行うのか分かりません。ここに私のコードの一部があります。機械学習の実験のためのScikit

vec = DictVectorizer() 
X = vec.fit_transform(instances) # No train/ test set, because we'll use 10-fold cross validation 
scaler = StandardScaler(with_mean=False) 
X_scaled = scaler.fit_transform(X) # To make sure everything is on the same scale 

enc = LabelEncoder() 
y = enc.fit_transform(labels) 

#feature selection 
from sklearn.feature_selection import SelectKBest, mutual_info_classif 
feat_sel = SelectKBest(mutual_info_classif, k=200) 
X_fs = feat_sel.fit_transform(X_scaled, y) 

#train a classifier 
from sklearn import model_selection 
from sklearn.metrics import classification_report 
from sklearn.naive_bayes import MultinomialNB 
clf = MultinomialNB() 
y_pred = model_selection.cross_val_predict(clf, X_fs, y, cv=10) 

折りたたみの選択に手伝ってもらえますか?

答えて

1

投稿した2番目の質問に回答してください。

あなたは、クロスバリデーションを使用して結果を参照することができます

の操作を行います。

from sklearn.feature_selection import SelectKBest, mutual_info_classif, RFECV 
from sklearn import model_selection 
from sklearn.metrics import classification_report 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline   
from sklearn.model_selection import cross_val_score 
import numpy as np 

feat_sel = SelectKBest(mutual_info_classif, k=200) 

clf = MultinomialNB() 
pipe = Pipeline([('mutual_info',feat_sel), ('naive_bayes',clf)]) 

scores = cross_val_score(pipe, X_scaled, y, cv =10, scoring = 'accuracy') 
print(np.mean(scores)) 
+0

私は 'パイプを行う必要はない.fit() 'もう? – Bambi

+1

@Bambiはいもちろん、もう必要はありません。あなたがそれを呼び出すと、cross_val_scoresはeveythingを行います – sera

1

Pipelineを使用して、機能セレクタと分類器をパイプラインに参加させ、パイプラインを相互検証することができます。

参考:http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

+0

私はパイプラインのコードでそれを編集します。私の正確さはパイプラインを使わなかった時より約10%高くなりました。これは可能ですか? – Bambi

+0

あなたの答えに対するSeraのコメントが解決策を提供します。 – noisefield

0

私はコメントで、先端に続き、このコードを思い付いた:

from sklearn.feature_selection import SelectKBest, mutual_info_classif, RFECV 
from sklearn import model_selection 
from sklearn.metrics import classification_report 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline   


feat_sel = SelectKBest(mutual_info_classif, k=200) 

clf = MultinomialNB() 
pipe = Pipeline([('mutual_info',feat_sel), ('naive_bayes',clf)]) 
pipe.fit(X_scaled,y) 
y_pred = pipe.predict(X_scaled) 

さて、突然私の精度スコアは、10%高くなっている、これは可能ですか?あるいは、私のパイプラインコードに何か問題がありますか?

+1

フィッティングに使用したのと同じデータを予測する – sera

+2

model_selection.cross_val_predict(pipe、X_scaled、y、cv = 10)を使用し、結果を表示 – sera