• Python机器学习bug:ValueError_ Expected 2D array, got 1D array instead


    0 前言

    在学习机器学习时,为了便于理解观察,有时候会拿一些一维的数组进行测试,在初学阶段可能就难免会踩到这个坑。这个bug处理起来比较简单,就是将一维的数组变成二维的数组。

    相关环境:

    Windows 64位
    Python3.9
    scikit-learn1.0.2
    pandas
    1.4.2

    1 场景还原

    下面用一个简单的小例子还原一下场景来看看如何处理:
    在做一个线性回归训练的时候,前面读数据、画图,进展的很顺利,但是到了训练模型步骤竟然报错了,从字面意思,训练模型期望传递一个二维的数组,但是实际传递的是一维数组,从给出的信息看,是X出问题了。
    相关代码如下:

    # 测试代码
    import pandas as pd
    # 调用sklearn的线性模型
    from sklearn.linear_model import LinearRegression
    
    data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
    X = data.loc[:,'x']
    y = data.loc[:,'y']
    
    # 实例化线性模型
    lr_model = LinearRegression()
    
    # 训练模型
    lr_model.fit(X,y)
    # 预测x结果
    y_predict = lr_model.predict(X)
    # 预测具体某个值的结果
    y_p = lr_model.predict([[3.5]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    报错内容:

    ValueError: Expected 2D array, got 1D array instead: array=[1 2 3 4 5 6].
    Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

    2 解决方案

    官方在报错之后也提供了相关的解决方案,只要对报错的array=[1 2 3 4 5 6]加一步array.reshape(-1, 1)转换为二维数组即可。
    具体代码如下,添加了第12~13行。将Series转化为二维数组即可。

    import pandas as pd
    # 调用sklearn的线性模型
    from sklearn.linear_model import LinearRegression
    
    data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
    X = data.loc[:,'x']
    y = data.loc[:,'y']
    
    # 实例化线性模型
    lr_model = LinearRegression()
    
    # 将Series转化为二维数组
    X = X.values.reshape(-1, 1) 
    # 训练模型
    lr_model.fit(X,y)
    # 预测x结果
    y_predict = lr_model.predict(X)
    # 预测具体某个值的结果
    y_p = lr_model.predict([[3.5]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    除了使用array.reshape(-1, 1),还可以在一开始给变量X赋值的时候就从data中取出一个二维数组,使用X = df[['x']]即可。
    具体代码如下:

    import pandas as pd
    # 调用sklearn的线性模型
    from sklearn.linear_model import LinearRegression
    
    data = pd.DataFrame({'x':[1,2,3,4,5,6],'y':[3,4,5,6,7,8]})
    # X = data.loc[:,'x']
    X = data[['x']].values      # values是转化为数组,不转也不影响最终的结果,只是会有一个提示:X does not have valid feature names
    y = data.loc[:,'y']
    
    # 实例化线性模型
    lr_model = LinearRegression()
    
    # 训练模型
    lr_model.fit(X,y)
    # 预测x结果
    y_predict = lr_model.predict(x)
    # 预测具体某个值的结果
    y_p = lr_model.predict([[3.5]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注:这里忽略了一些查看数据的过程,大家有需要自己打印出来看看。

  • 相关阅读:
    ChinaSkills技能大赛网络系统管理Debian模块||StorageSrv的ShellScript配置详解
    【两种方法实现 CSS/Javascript 简单的图片轮播效果】
    AIDL+MemoryFile匿名共享内存实现跨进程大文件传输
    web前端-javascript-立即执行函数(说明、例子)
    已知文档被分成几个区块,一些行被改动,现在要求把有改动的区块找出来应该怎么做
    SpringBoot线程上下文传递数据
    MyBatis的缓存
    Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(三)
    系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料
    面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招
  • 原文地址:https://blog.csdn.net/qq_45476428/article/details/128072406