pandas get_dummies 的 Sklearn RFE
Sklearn RFE with pandas get_dummies
我正在尝试了解当我使用 pandas get_dummies
创建的分类列时如何将 sklearn RFE 用于线性回归模型
我有一个数据集,布局是:
y = Carsales
X = Unemployment, Queries, CPI_energy, CPI_all, Month(comes in as an int)
我做的第一件事是将月份转换为对象,然后是类别(直接转换为类别类型在 pandas 中不起作用)。
df['MonthFac'] = df['Month'].astype('object')
df['MonthFac'] = df['MonthFac'].astype('category')
然后我创建我的 X, y:
from sklearn.linear_model import LinearRegression
cols = ['Unemployment','Queries','CPI_energy','CPI_all']
X = pd.concat([train[cols],(pd.get_dummies(train['MonthFac']))], axis = 1)
y = train['ElantraSales'].values
lm1 = LinearRegression()
lm1.fit(X,y)
那我想用RFE:
from sklearn.feature_selection import RFE
selector = RFE(lm1,step=1, n_features_to_select = 2)
selector.fit(X,y)
寻找 2 个特征的简单 RFE,但结果是它将月份中的 2 个列排名为 1,从技术上讲,我只需要在月份中的 1 个列排名为 1 时才需要 'MonthFac' 变量在构建我的模型时很重要,我想知道要使用的另一个排名靠前的变量是什么。
或者我只是应该使用我的演绎推理来根据 selector.ranking_
输出找出要使用的其他变量?
与R相比,sklearn的学习曲线似乎要高很多。
我也在 pandas/sklearn 中做分类值吗?在 R 中,我所要做的就是 as.factor
和 BAM 它完成了所有这些。
还有一个问题,如果我不确定最佳特征数量是多少,我想我可以创建一个循环选择器 R^2/R^2 adj/MSE 并将它们打印出来,但是因为我如果有那些额外的月份列,我的循环会转到 16,因为基本上有 16 个功能,有没有更好的方法来做到这一点?
对于你问题的第一部分,每个虚拟变量都被视为一个独特的特征(以你的 12 个月虚拟变量为例,它会产生 11/12 虚拟变量。以 Jan 为基准常数,其他 11 个虚拟变量会告诉您某个特定月份是否具有与 1 月不同的平均常数),因此 RFE
为您选择两个月份的虚拟变量特征是完全合理的。
但是,由于您在 RFE
中使用默认 LinearRegression
,并且 RFE
使用 .coef_
对特征重要性进行排名,因此您应该设置 LinearRegression(normalize=True)
。否则,根据线性回归系数选择特征是没有意义的。
我正在尝试了解当我使用 pandas get_dummies
创建的分类列时如何将 sklearn RFE 用于线性回归模型我有一个数据集,布局是:
y = Carsales
X = Unemployment, Queries, CPI_energy, CPI_all, Month(comes in as an int)
我做的第一件事是将月份转换为对象,然后是类别(直接转换为类别类型在 pandas 中不起作用)。
df['MonthFac'] = df['Month'].astype('object')
df['MonthFac'] = df['MonthFac'].astype('category')
然后我创建我的 X, y:
from sklearn.linear_model import LinearRegression
cols = ['Unemployment','Queries','CPI_energy','CPI_all']
X = pd.concat([train[cols],(pd.get_dummies(train['MonthFac']))], axis = 1)
y = train['ElantraSales'].values
lm1 = LinearRegression()
lm1.fit(X,y)
那我想用RFE:
from sklearn.feature_selection import RFE
selector = RFE(lm1,step=1, n_features_to_select = 2)
selector.fit(X,y)
寻找 2 个特征的简单 RFE,但结果是它将月份中的 2 个列排名为 1,从技术上讲,我只需要在月份中的 1 个列排名为 1 时才需要 'MonthFac' 变量在构建我的模型时很重要,我想知道要使用的另一个排名靠前的变量是什么。
或者我只是应该使用我的演绎推理来根据 selector.ranking_
输出找出要使用的其他变量?
与R相比,sklearn的学习曲线似乎要高很多。
我也在 pandas/sklearn 中做分类值吗?在 R 中,我所要做的就是 as.factor
和 BAM 它完成了所有这些。
还有一个问题,如果我不确定最佳特征数量是多少,我想我可以创建一个循环选择器 R^2/R^2 adj/MSE 并将它们打印出来,但是因为我如果有那些额外的月份列,我的循环会转到 16,因为基本上有 16 个功能,有没有更好的方法来做到这一点?
对于你问题的第一部分,每个虚拟变量都被视为一个独特的特征(以你的 12 个月虚拟变量为例,它会产生 11/12 虚拟变量。以 Jan 为基准常数,其他 11 个虚拟变量会告诉您某个特定月份是否具有与 1 月不同的平均常数),因此 RFE
为您选择两个月份的虚拟变量特征是完全合理的。
但是,由于您在 RFE
中使用默认 LinearRegression
,并且 RFE
使用 .coef_
对特征重要性进行排名,因此您应该设置 LinearRegression(normalize=True)
。否则,根据线性回归系数选择特征是没有意义的。