当前位置:首页 » 《随便一记》 » 正文

SVM ValueError: y should be a 1d array, got an array of shape (1, 250) instead. Found input variable

6 人参与  2022年12月22日 13:45  分类 : 《随便一记》  评论

点击全文阅读


文章目录

1、问题描述:2、分析与解决办法:3、DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().4、总结

1、问题描述:

背景:机器学习时关于SVM的学习,之前线性回归、逻辑回归切分数据集时均是将X切分为(输入特征维数,样本数),例如(5,250)代表输入特征是5维,样本数是250个。那是因为之前手敲线性、逻辑回归时用到的数学公式要求维度是这样。但是如果直接使用sklearn库里的现成函数,需要的恰恰相反,即需要(样本数,输入特征维数)这样的格式作为参数的输入。否则报错。

函数:svm.SVC中的 fit() 函数

bug:

ValueError: y should be a 1d array, got an array of shape (1, 250) instead.ValueError: Found input variables with inconsistent numbers of samples: [5, 250].ValueError: X has 250 features, but SVC is expecting 5 features as input.DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().

code:

# SVM训练与预测 1.0res = svm.SVC(C=svm_C, kernel=svm_kernel) res.fit(train_set_X, train_set_y)             #训练train_predict_y = res.predict(train_set_X)    #训练集上的预测test_predict_y = res.predict(test_set_X)      #测试集上的预测

2、分析与解决办法:

1、首先运行上方原代码,会报错:

ValueError: y should be a 1d array, got an array of shape (1, 250) instead。

查看变量列表如下图

在这里插入图片描述

可以看到train_set_y的shape是(1,250),而这里期望的shape是(250,)。

所以解决办法:

二维转一维即可,我习惯用reshape(-1),当然还有flatten()、ravel()、squeeze()函数都能实现。

# SVM训练与预测 2.0res = svm.SVC(C=svm_C, kernel=svm_kernel) res.fit(train_set_X, train_set_y.reshape(-1))             #训练   修正!!!# res.fit(train_set_X, train_set_y.flatten())               #训练   修正!!!# res.fit(train_set_X, train_set_y.ravel())                 #训练   修正!!!# res.fit(train_set_X, np.squeeze(train_set_y))             #训练   修正!!!train_predict_y = res.predict(train_set_X)    #训练集上的预测test_predict_y = res.predict(test_set_X)      #测试集上的预测

2、但运行上述代码又报错:

ValueError: Found input variables with inconsistent numbers of samples: [5, 250]

意思是“样本数和输入变量不一致”。想不通,就去查看源码的说明,如下:

在这里插入图片描述

可以看到上图,当我们将train_set_y由 (1,250) 变为 (250,) 并将其作为y传入时,250会被视作样本个数,自己也确实是250个样本的标注,这一点符合。

但是请注意,这里train_set_X的shape是(5,250),按照上图注释的意思,5会被视作样本数,250被实作输入特征的维数,而后面train_set_y是被视作有250个样本,故自然报错不匹配。

所以解决办法:

1、使用.T属性,将train_set_X的shape由(5,250)转为(250,5);
2、既然train_set_X使用了.T属性,为了好看,train_set_y也先使用.T属性有(1,250)转为(250,1),再使用.reshape(-1)即可;

# SVM训练与预测 3.0res = svm.SVC(C=svm_C, kernel=svm_kernel) res.fit(train_set_X.T, train_set_y.T.reshape(-1))             #训练   修正!!!# res.fit(train_set_X.T, train_set_y.T.flatten())               #训练   修正!!!# res.fit(train_set_X.T, train_set_y.T.ravel())                 #训练   修正!!!# res.fit(train_set_X.T, np.squeeze(train_set_y))             #训练   修正!!!train_predict_y = res.predict(train_set_X)    #训练集上的预测test_predict_y = res.predict(test_set_X)      #测试集上的预测

其实吧,不用这么麻烦,直接最初切分数据集时变成需要的不就行了?不然之后用一次还要.T转一次。

2、但运行上述代码还报错:

- - -> 67 train_predict_y = res.predict(train_set_X) #训练集上的预测
ValueError: X has 250 features, but SVC is expecting 5 features as input.

那这里的分析就不难了,再使用.T就行了。故修正code如下:

# SVM训练与预测res = svm.SVC(C=svm_C, kernel=svm_kernel) res.fit(train_set_X.T, train_set_y.T.reshape(-1))             #训练# res.fit(train_set_X, train_set_y.flatten())               #训练# res.fit(train_set_X, train_set_y.ravel())                 #训练# res.fit(train_set_X, np.squeeze(train_set_y))             #训练train_predict_y = res.predict(train_set_X.T)    #训练集上的预测test_predict_y = res.predict(test_set_X.T)      #测试集上的预测

3、DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().

自己后来看老师标准代码时,老师传入的X是(250,5),y是(250,1)。自己产生了疑惑,定义里不是说了y应该为(250,)。于是自己尝试按照老师的运行了下,发现给了个警告。所以虽然不用管也能运行,但还是按照规范吧。

解决方法:

见之前写的文章《DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the》

4、总结

码字不易,有用记得点赞!


点击全文阅读


本文链接:http://zhangshiyu.com/post/50188.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • [完结]陆依霜轩辕翊/繁花盛意难平全
  • 全书免费沈汀妤谢清池畅读_沈汀妤谢清池畅读全书免费
  • 全文陆依霜轩辕翊/繁花盛意难平+后续+结局(轩辕翊陆依霜)列表_全文陆依霜轩辕翊/繁花盛意难平+后续+结局
  • 「薄雪不言爱,春深两相误」小说后续在线免费阅读_[沈凛奶奶檀香]小说精彩章节试读
  • 人面桃花长相忆全书+后续+结局(阮雾黎闻砚辞)结局_(阮雾黎闻砚辞人面桃花长相忆全书+后续+结局全书结局)结局列表_笔趣阁(阮雾黎闻砚辞)
  • 阮雾梨闻砚辞(人面桃花长相忆+后续+结局)结局_(阮雾梨闻砚辞人面桃花长相忆+后续+结局全书结局)结局列表_笔趣阁(阮雾梨闻砚辞)
  • 人面桃花长相忆精彩节选阮雾梨闻砚辞完本_人面桃花长相忆精彩节选(阮雾梨闻砚辞)
  • 他悔悟时我已不爱+后续+结局(沈知薇陆景淮)结局_(沈知薇陆景淮他悔悟时我已不爱+后续+结局全书结局)结局列表_笔趣阁(沈知薇陆景淮)
  • 为了小男友未婚妻竟给我下兽药最新章节在线阅读_「许婉仪林海谢予川」精彩节选推荐
  • 阮雾梨闻砚辞最后结局_阮雾梨闻砚辞最后结局
  • 全书浏览人面桃花长相忆完结爽文(阮雾梨闻砚辞)_人面桃花长相忆完结爽文(阮雾梨闻砚辞)全书结局
  • 繁花盛意难平结局+番外(陆依霜轩辕翊)_(繁花盛意难平结局+番外后续)陆依霜轩辕翊列表_笔趣阁(繁花盛意难平结局+番外)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1