Sklearn 0.20+的交叉验证?

时间:2017-11-13 20:38:41

标签: python machine-learning scikit-learn cross-validation sklearn-pandas

我正在尝试进行交叉验证,我遇到了一个错误:'发现输入变量数量不一致的样本:[18,1]'

我在pandas数据框(df)中使用不同的列作为功能,最后一列作为标签。这来自加州大学欧文分校的机器学习库。导入我过去使用的交叉验证包时,我收到一个可能已经折旧的错误。我将运行决策树,SVM和K-NN。

我的代码是这样的:

feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'],
       df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'],
       df['cons.conf.idx'], df['euribor3m'], df['nr.employed']]
label = [df['y']]

from sklearn.cross_validation import train_test_split
from sklearn.model_selection import cross_val_score
# Model Training 
x = feature[:]
y = label
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:5)

cross_validation模块已弃用。新模块model_selection取而代之。所以你用cross_validation做的一切。现已在model_selection中提供。然后您的上述代码变为:

feature = [df['age'], df['job'], df['marital'], df['education'], df['default'], df['housing'], df['loan'], df['contact'],
       df['month'], df['day_of_week'], df['campaign'], df['pdays'], df['previous'], df['emp.var.rate'], df['cons.price.idx'],
       df['cons.conf.idx'], df['euribor3m'], df['nr.employed']]
label = [df['y']]

from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score

现在就声明X和y而言,为什么要将它们包装在列表中。只需像这样使用它们:

feature = df[['age', 'job', 'marital', 'education', 'default', 'housing', 
              'loan', 'contact', 'month', 'day_of_week', 'campaign', 
              'pdays', 'previous', 'emp.var.rate', 'cons.price.idx', 
              'cons.conf.idx', 'euribor3m', 'nr.employed']]
label = df['y']

然后您可以简单地使用您的代码,而无需更改任何内容。

# Model Training 
x = feature[:]
y = label
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

关于交叉验证中折叠的最后一个问题,sklearn中有多个类可以执行此操作(取决于任务)。请看看:

其中包含折叠迭代器。请记住,所有这些都存在于model_selection包中。

答案 1 :(得分:1)

feature列表中的项目是pandas系列。您不需要像列出的那样在列表中列出每个功能;你只需要将它们全部作为一个表格传递给它,而且需要将它们全部传递出去。

例如,这看起来像银行数据集:

df = pd.read_csv('bank.csv', sep=';')
#df.shape
#(4521, 17)
#df.columns
#Index(['age', 'job', 'marital', 'education', 'default', 'balance', 'housing',
#       'loan', 'contact', 'day', 'month', 'duration', 'campaign', 'pdays',
#       'previous', 'poutcome', 'y'],
#      dtype='object')

x = df.iloc[:, :-1]
y = df.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)

应该有效。这里唯一要注意的是x是一个包含16列的DataFrame,但它的基础数据是numpy ndarray - 不是系列列表而是单个"矩阵"。