【发布时间】:2015-12-27 22:18:58
【问题描述】:
步骤0:问题描述
我有一个分类问题,即我想根据一组数字特征、使用逻辑回归并在运行主成分分析 (PCA) 之后预测二元目标。
我有 2 个数据集:df_train 和 df_valid(分别为训练集和验证集)作为 pandas 数据框,包含特征和目标。作为第一步,我使用get_dummies pandas 函数将所有分类变量转换为布尔值。例如,我会:
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。否则,它们将被投影到不同的特征向量上。
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
第二步:逻辑回归
这不是必需的,但我更喜欢将东西保存为数据框:
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)
我认为第 2 步是正确的,但我对第 1 步有更多疑问:这是我应该链接 PCA 的方式,然后是分类器吗?
【问题讨论】:
-
我认为该程序没有任何问题。你的结果呢?你得到预期的输出了吗?
-
我的数据上的一个意外行为(与此处显示的示例不同)是,当我增加 PCA 函数中的组件数量时,我的混淆矩阵变得更糟!另外,我想知道“虚拟化”过多的分类变量是否对结果没有任何影响?我应该在 PCA 期间排除“目标”列吗?
-
目标不是您数据的一部分。所以在使用 PCA 时排除目标标签。对于分类数据,您应该使用 sklearn 中实现的一种热表示。
-
@Riyaz 谢谢!是的,这就是我在 pandas 中使用 get_dummies 所做的,这相当于一种热编码。
-
如果您增加 PCA 中的组件数量(因此有很多您正在使用的功能),则可能会过度拟合您的训练集并且无法正确泛化,因此会产生混淆矩阵。
标签: python scikit-learn classification logistic-regression pca