使用SKLearn构建模型时如何忽略某列?

13

使用R语言,在构建模型时可以使用以下语法忽略一个变量(列):

model = lm(dependant.variable ~ . - ignored.variable, data=my.training,set)

如果你的数据集包含索引或ID,那么使用SKlearn在Python中进行操作会非常方便。

假设你的数据是Pandas数据帧,那么该如何操作呢?


传递给您的数据将是NumPy数组或者可能是pandas(它会分解为NumPy数组),您可以选择和索引感兴趣的列,并将这些列传递给lm函数,请参考numpy文档pandas文档 - EdChum
好的,我有超过300列。如果我必须手动进行,我宁愿忽略1列而不是添加299列。 - Mathieu
3
在pandas中,您可以执行list(df.columns) - ignore_col,这不会太冗长,并且可以排除指定的列。 - EdChum
我该如何将保留列的列表输入到SKlearn中? - Mathieu
2
通常情况下,您会将数据和标签作为X、y参数传递给fit函数,例如:clf = LogisticRegression(),然后clf.fit(X,y)。如果使用pandas,则最后一行代码将变成clf.fit(df[list(df.columns) - ignoreCol].values, df.target.values)。这只是一个伪例子,但它应该能够说明我的意思。在这里有一个使用pandas和sklearn的示例:http://python.dzone.com/articles/python-making-scikit-learn-and - EdChum
显示剩余2条评论
1个回答

13

这是我去年用来在StackOverflow上进行一些预测的代码:

from __future__ import division
from pandas import *
from sklearn import cross_validation
from sklearn import metrics
from sklearn.ensemble import GradientBoostingClassifier

basic_feature_names = [ 'BodyLength'
                      , 'NumTags'
                      , 'OwnerUndeletedAnswerCountAtPostTime'
                      , 'ReputationAtPostCreation'
                      , 'TitleLength'
                      , 'UserAge' ]

fea = # extract the features - removed for brevity
# construct our classifier
clf = GradientBoostingClassifier(n_estimators=num_estimators, random_state=0)
# now fit
clf.fit(fea[basic_feature_names], orig_data['OpenStatusMod'].values)
# now 
priv_fea = # this was my test dataset
# now calculate the predicted classes
pred = clf.predict(priv_fea[basic_feature_names])

所以,如果我们想要分类的特征子集,我可以这样做:

# want to train using fewer features so remove 'BodyLength'
basic_feature_names.remove('BodyLength')

clf.fit(fea[basic_feature_names], orig_data['OpenStatusMod'].values)

因此,这里的想法是可以使用列表来选择Pandas数据框中的列的子集,因此我们可以构建一个新列表或删除一个值并将其用于选择。

我不确定如何在使用NumPy数组时轻松地执行此操作,因为索引方式不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接