调试多项式回归器代码

本文记录了在Python 2.7环境下调试机器学习多项式回归器代码时遇到的Deprecation Warning问题。错误提示要求数据要么通过X.reshape(-1, 1)重塑为单特征,要么通过X.reshape(1, -1)重塑为单个样本。作者通过逐步排查,确定问题在于数据输入格式,并在reshape操作中找到了解决方案,确保代码在运行时不再出现警告。" 128359119,9425305,宿舍自制局域网:从物理层到MAC层的联机游戏实践,"['网络', '网络协议', '局域网']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[调试多项式回归器代码错误,调试过程及总结]

Deprecation Warning: Reshape your data either using X.reshape(-1, 1)···or X.reshape(1, -1)

1.运行环境

  • 系统:win 7 64位

    • Python版本:python 2.7

    • 代码编辑器:PyCharm Community

    • 代码来源: Python Machine Learning Cookbook中文版—Python机器学习经典实例1.8创建多项式回归器,源码在出版社 GitHub 上:regression_multivar.py

2.报错:

Deprecation Warning: Passing 1d arrays as data is deprecated in 0.17 and will raise Value Error in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.

(中文翻译:弃用警告:传递1d 数组作为数据在0.17中被弃用,并会在0.19中引发值错误。 如果数据具有单个特征,则使用X.reshape(-1,1)重新整形数据,如果数据包含单个特征,则使用X.reshape(1,-1)重整数据)

3.代码前期修改过程

# 源码
filename =  sys.argv[1]  # 需要使用外部shell命令打开,有点复杂,所以直接写文件名,在pycharm里面执行
# 更改后的代码
filename = 'data_multivar.txt'
  • 官网上的代码从一列输入样本变为三列输入样本并没有对里面的一些维数进行调整,导致数据过多,就是这行代码:xt, yt = [float(i) for i in line.split(',')]``xt1, 经过简单修改后,成功走通xt2, xt3, yt = [float(i) for i in line.split(',')]

4.经过上述修改过程后,就报错:

Deprecation Warning: Passing 1d arrays as data is deprecated in 0.17 and will raise Value Error in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.

5.调试了两个多小时的过程如下:

  1. 代码错误:猜测是自己输错了,对照书和源码,发现没有输错,得出源码在我电脑和python版本下存在bug的结论。
  2. 去github的纠错版本上,没有发现相关的。
  3. 去google,biying,然而并不能看懂或者找到适合我答案的方法
  4. 开始自行调试bug,最终定位在点datapoint的输入有问题
  5. 刚开始在predict的时候改正,调试bug发现错误仍旧存在
  6. 最终将两个小问题简化为一个小问题
  7. 看到有博客说要按照英文帮助的输入格式输入,我去查官网,发现是n_sample,n_feature.我想n是不是不能等于1啊,我试了一下两组数,终于没有警告了。
  8. 但是我还是觉得,n没有默认不等于1啊,说明一个数是可以的,再次斟酌n_sample,n_feature,发现我的只有一个样本,所以是一行3列,在定义的时候reshape了下,马上跑通了,在predict里面试了,也跑通了。
  9. 恩,看来是刚才应该两处都要改,但只改了一处,所以没有发现转好的迹象。重点概念还是要弄清楚啊!

6.现将改正后的源码附在下面

# usr/bin/env python
# -*- coding:utf-8 -*-

import numpy as np
from sklearn import linear_model

filename = 'data_multivar.txt'
X = []
y = []
with open(filename, 'r') as f:
    for line in f.readlines():
        xt1, xt2, xt3, yt = [float(i) for i in line.split(',')]
        xt = [xt1, xt2, xt3]
        X.append(xt)
        y.append(yt)
# -----------建立机器学习模型---------------------
num_training = int(0.8 * len(X))
num_test = len(X) - num_training

# 训练数据
X_train = np.array(X[:num_training]).reshape((num_training,3))
y_train = np.array(y[:num_training]).reshape((num_training,1))

# 测试数据
X_test = np.array(X[num_training:]).reshape((num_test,3))
y_test = np.array(y[num_training:]).reshape((num_test,1))

# ----------------创建一个回归器对象-----------------------


# 创建线性回归对象
linear_regressor = linear_model.LinearRegression()

# 用训练数据集训练模型
linear_regressor.fit(X_train, y_train)


# --------------------------创建多项式回归器-------------------------


from sklearn.preprocessing import PolynomialFeatures

polynomial = PolynomialFeatures(degree=3)
X_train_transformed = polynomial.fit_transform(X_train)

# 用文件的第一个数据点检查是否多项式可以准确预测
datapoint = np.array([0.39, 2.78, 7.11]).reshape((1,-1))

poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(X_train_transformed, y_train)

print '\nLinear regression:', linear_regressor.predict(datapoint)[0]
print '\nPolynomial regression:', poly_linear_model.predict(poly_datapoint)[0]

7.代码反思

datapoint = np.array([[0.39, 2.78, 7.11]]) # 也是ok的,shape为(1L, 3L)
# 但是源码中 datapoint = np.array([0.39, 2.78, 7.11])是(3L,),很奇怪,要尽量避免。

8.调试反思

重难点知识着重掌握,调试bug要由小及大。

参考:

苹果提子
numpy.reshape帮助文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值