• 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

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

  • 相关阅读:
    SpringBoot学习_day4-5
    Java内存马学习--Filter内存马
    社区点赞业务缓存设计优化探索
    2022年高考都结束了,还有人真觉得程序员下班后不需要学习吗?
    JVM参数及默认值
    nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
    02.3 线性代数
    pyspark.sql.dataframe.DataFrame 怎么转pandas DataFrame
    Java数组
    javavue健身食谱系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/qq_45476428/article/details/128072406