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