SVM ValueError: y should be a 1d array, got an array of shape (1, 250) instead. Found input variable
阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!
文章目录
- 阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!
- 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().
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.0
res = 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.0
res = 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.0
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.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》
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
SVM ValueError: y should be a 1d array, got an array of shape (1, 250) instead. Found input variable相关推荐
- rasa_nlu_chi 测试不成功 “error“: “y should be a 1d array, got an array of shape (1, 5) instead.
rasa_nlu_chi原始git链接: https://github.com/crownpku/rasa_nlu_chi rasa_nlu_chi实现博客链接: 实现过程中有问题解决方法的博客: h ...
- Matlab中解决出现的错误使用 svmtrain (line 234) Y must be a vector or a character array.问题
Matlab中解决出现的错误使用 svmtrain (line 234) Y must be a vector or a character array.问题 目录 解决问题 解决思路 解决方法 解决 ...
- ValueError: Masked arrays must be 1-D
ValueError: Masked arrays must be 1-D 使用numpy画散点图出现以上问题.(<机器学习-算法原理与编程实践>第7页) 原代码如下:
- 吴恩达深度学习作业L1W2:ValueError: cannot reshape array of size 12288 into shape (50,1)
照着代码敲下来,测试部分的代码都没问题,到了最后整合的实战代码就突然报错ValueError: cannot reshape array of size 12288 into shape (50,1) ...
- ValueError: At least one stride in the given numpy array is negative解决方案
ValueError: At least one stride in the given numpy array is negative, and tensors with negative stri ...
- ValueError: At least one stride in the given numpy array is negative
问题: ValueError: At least one stride in the given numpy array is negative, and tensors with negative ...
- Densefuse: 成功解决ValueError: cannot reshape array of size xxx into shape (xxx,xxx,xxx)
最近在复现图像融合Densefuse时,出现报错: ValueError: cannot reshape array of size 97200 into shape (256,256,1) 在网上查 ...
- 错误使用 svmtrain svmtrain has been removed. Use fitcsvm instead.Y must be a vector or a character array
错误1 Error using svmtrain (line 230) svmtrain has been removed. Use fitcsvm instead. 错误2 Error using ...
- cannot reshape array of size 5011 into shape (2)
cannot reshape array of size 5011 into shape (2) import numpy as npinds=[] inds.append(1) inds.appen ...
最新文章
- mysql 查看表结构,字段的基本信息(简单明了)。
- (C#)AJAX post方式传值
- git/ TortoiseGit如何使用证书登录
- java lock condition_Java 通过 Lock 和 竞争条件 Condition 实现生产者消费者模式
- Ceph 时钟偏移故障处理
- [Unity] AnimationEvent 的 receiver 需要继承 Mono
- C#结构体和字节数组的转换
- vue 头部组件监控页面来源
- 聚焦行业新风口 白鹭科技云游戏战略发布会成功举办
- 酱油瓶上有两个字很重要,一直都被忽略了,以后看准再买!
- 记录一次es head测试使用说明
- 知了课堂Day3——微信小程序基础03——组件的一些笔记
- 探讨破解3G今日困局之策
- python 典型相关分析_CCA典型关联分析原理与Python案例
- vue3 通过naive-ui 使用xicons
- texstudio语法检查
- 背单词App开发日记1
- Excel的文件打开特别慢,xls文件特别大解决一例
- 18W快充4000毫安电量 魅族魅蓝Note5续航实测
- mc9s08dz60添加BootLoader实现CANboot下载更新功能