关于python:分类:使用sklearn的PCA和逻辑回归

classification: PCA and logistic regression using sklearn

步骤0:问题描述

我有一个分类问题,即我想使用逻辑回归在运行主成分分析(PCA)之后,根据一组数字特征预测一个二进制目标。

我有2个数据集:df_traindf_valid(分别为训练集和验证集)作为熊猫数据框,其中包含要素和目标。第一步,我使用了get_dummies pandas函数将所有分类变量转换为布尔值。例如,我将有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

我现在想应用PCA来减少问题的范围,然后使用sklearn中的LogisticRegression进行训练并获得对我的验证集的预测,但是我不确定我遵循的过程是否正确。这是我的工作:

步骤1:PCA

我的想法是,我需要使用PCA以相同的方式转换我的训练和验证集。换句话说,我不能单独执行PCA。否则,它们将被投影到不同的特征向量上。

1
2
3
4
5
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

第二步:逻辑回归

不必要,但我更喜欢将其保留为数据框:

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

现在我执行逻辑回归

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

我认为第2步是正确的,但是我对第1步有更多的疑问,我应该采用这种方式链接PCA,然后分类器吗?


sklearn中有一个管道用于此目的。

1
2
3
4
5
6
7
8
9
10
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)