classification: PCA and logistic regression using sklearn
步骤0:问题描述
我有一个分类问题,即我想使用逻辑回归在运行主成分分析(PCA)之后,根据一组数字特征预测一个二进制目标。
我有2个数据集:
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中的
步骤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) |