【问题标题】:Cross-validation for Sklearn 0.20+?Sklearn 0.20+的交叉验证?
【发布时间】:2018-04-26 15:44:43
【问题描述】:

我正在尝试进行交叉验证,但遇到了一个错误,提示:“找到样本数量不一致的输入变量:[18, 1]”

我使用 pandas 数据框 (df) 中的不同列作为特征,最后一列作为标签。这源自 UC Irvine 的机器学习存储库。在导入我过去使用的交叉验证包时,我收到一个错误,它可能已经贬值。我将运行决策树、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)

任何帮助都会很棒!

【问题讨论】:

  • 这个错误有什么不清楚的地方?打印 x 的类型和形状。它看起来像一个 pd 系列的列表,可能不是您想要的。

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


【解决方案1】:

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 包中。

【讨论】:

    【解决方案2】:

    feature 列表中的项目是熊猫系列。您不需要像以前那样在列表中列出每个功能;您只需要将它们全部作为一个“表”传递。

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

    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 - 不是一个系列列表,而是一个单一的“矩阵”。

    【讨论】:

    • 这似乎正在运行,谢谢。我的下一个问题是,在我导入的交叉验证包中是否有可以指定交叉验证的折叠数量?我不相信“train_test_split”采用该参数。
    猜你喜欢
    • 2012-12-31
    • 2018-08-16
    • 1970-01-01
    • 2015-06-11
    • 2021-03-25
    • 2017-03-15
    • 2016-05-07
    • 2021-02-10
    • 2018-08-20
    相关资源
    最近更新 更多