第0步:问题描述
我有一个分类问题,即我想基于数字特征的集合,使用逻辑回归和运行主成分分析(PCA)来预测二进制目标.
我有2个数据集:df_train和df_valid(分别是训练集和验证集)作为pandas数据框,包含特征和目标.作为第一步,我使用了get_dummies pandas函数将所有分类变量转换为boolean.例如,我会:
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,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),n_valid).astype(bool),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.否则,它们将被投射到不同的特征向量上.
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
第二步:Logistic回归
这没有必要,但我更喜欢将事物保存为数据帧:
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)
最佳答案
为此目的,sklearn中有一个pipeline.
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)