2015-09-30 14 views
5

ステップ0:問題の説明私は分類の問題を抱えている

は、すなわち私はロジスティック回帰を使用して、数値的な特徴の集合に基づいて、バイナリターゲットを予測したい、と実行した後主成分分析(PCA)。分類:PCAおよびロジスティック回帰使っsklearn

フィジカルとターゲットを含むパンダのデータフレームとして、df_traindf_valid(それぞれトレーニングセットと検証セット)の2つのデータセットがあります。最初のステップとして、get_dummiesパンダ関数を使用して、すべてのカテゴリ変数をブール値に変換しました。例えば、私が持っているでしょう:

n_train = 10 
np.random.seed(0) 
df_train = pd.DataFrame({"f1":np.random.random(n_train), \ 
         "f2": np.random.random(n_train), \ 
         "f3":np.random.randint(0,2,n_train).astype(bool),\ 
         "target":np.random.randint(0,2,n_train).astype(bool)}) 

In [36]: df_train 
Out[36]: 
     f1  f2  f3 target 
0 0.548814 0.791725 False False 
1 0.715189 0.528895 True True 
2 0.602763 0.568045 False True 
3 0.544883 0.925597 True True 
4 0.423655 0.071036 True True 
5 0.645894 0.087129 True False 
6 0.437587 0.020218 True True 
7 0.891773 0.832620 True False 
8 0.963663 0.778157 False False 
9 0.383442 0.870012 True True 

n_valid = 3 
np.random.seed(1) 
df_valid = pd.DataFrame({"f1":np.random.random(n_valid), \ 
         "f2": np.random.random(n_valid), \ 
         "f3":np.random.randint(0,2,n_valid).astype(bool),\ 
         "target":np.random.randint(0,2,n_valid).astype(bool)}) 

In [44]: df_valid 
Out[44]: 
     f1  f2  f3 target 
0 0.417022 0.302333 False False 
1 0.720324 0.146756 True False 
2 0.000114 0.092339 True True 

私はその後、私の問題の次元を減らす訓練し、私の検証セットに予測を得るためにsklearnからLogisticRegressionを使用するようにPCAを適用するために、今たいのですが、私はありません私が従う手順が正しいことを確かめてください。ここで私は何をすべきかです:

ステップ1:PCA

アイデアは、私はPCAと同じように設定し、私のトレーニングと検証の両方を変換する必要があるということです。つまり、ではなく、はPCAを別途実行できます。さもなければ、それらは異なった固有ベクトルに射影されます。

from sklearn.decomposition import PCA 

pca = PCA(n_components=2) #assume to keep 2 components, but doesn't matter 
newdf_train = pca.fit_transform(df_train.drop("target", axis=1)) 
newdf_valid = pca.transform(df_valid.drop("target", axis=1)) #not sure here if this is right 

ステップ2:ロジスティック回帰

は、それは必要はありませんが、私はデータフレームとして物事を維持することを好む:

features_train = pd.DataFrame(newdf_train) 
features_valid = pd.DataFrame(newdf_valid) 

そして今、私は、ロジスティック回帰分析を行う

from sklearn.linear_model import LogisticRegression 
cls = LogisticRegression() 
cls.fit(features_train, df_train["target"]) 
predictions = cls.predict(features_valid) 

Iステップ2が正しいと思うが、私はステップ1についてもっと疑問を抱いている:これは私がチェーンする方法であるPCA、次に分類器?

+0

私は手順に問題が表示されません。あなたの結果はどうですか?あなたは期待される成果を得ていますか? (ここに示す例とは異なる)私のデータに予期しない動作の – Riyaz

+0

一つは、私がPCA機能のコンポーネントの数を増やすように、私の混同行列が悪化するということです!また、あまりにも多くのカテゴリ変数を「ダミー化する」ことが結果に影響を与えないかどうかは疑問でした。 PCA中に「ターゲット」列を除外すべきですか? – ldocao

+3

ターゲットはあなたのデータの一部ではありません。したがって、PCAを使用している間はターゲットラベルを除外します。カテゴリデータの場合は、sklearnに実装されている1つのホット表現を使用する必要があります。 – Riyaz

答えて

2

pipelineは、この目的のためにsklearnにあります。

from sklearn.decomposition import PCA 
from sklearn.linear_model import LogisticRegression 
from sklearn.pipeline import Pipeline 

pca = PCA(n_components=2) 
cls = LogisticRegression() 

pipe = Pipeline([('pca', pca), ('logistic', clf)]) 
pipe.fit(features_train, df_train["target"]) 
predictions = pipe.predict(features_valid) 
+0

'clf'とは何ですか?それはタイプミスですか? – guy

+0

うん、それは 'cls'でなければなりません。 – Mooncrater

関連する問題