使用python3.5重新验证《python机器学习经典实例》中的代码时,经常碰到各种警告与错误。
一般来说警告来自于函数库的更新,原书使用python2.x,且函数库古老,一些模块被合并了,在调取对应方法时要记得更新名字,不然红色警告伤眼。
抛出的异常错误集中在P40页的对单一数据示例进行编码测试中的这一句代码:
input_data_encoded[i]=int(label_encoder[i].transform([input_data[i]]))
异常是:
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape ()
经过逐步分析,发现:input_data[i] 的值是单一字符串,但是transform方法中的参数需要列表格式,所以改成:[input_data[i]]
解决完这个问题后,第二个问题是:
output_class=classifier.predict(input_data_encoded)
报错为:
ValueError: Expected 2D array, got 1D array instead:
array=[ 3. 3. 0. 0. 2. 1.].
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.
这个问题与第一个问题类似,要将 input_data_encoded 重塑成一维数组。
在重塑前 input_data_encoded的值是 :[0 0 1 1 2 0]
重塑代码为:
input_data_encoded=input_data_encoded.reshape(1,6)
重塑后是:[[0 0 1 1 2 0]]
以上就是本节的难点了,全部修正后代码如下:
import numpy as np
from sklearn import preprocessing
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.model_selection import validation_curve
from sklearn.model_selection import learning_curve
#画图时显示中文字体
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
input_file=r'D:\python\AI\2\car.data.txt'
x=[]
count=0
with open(input_file,'r') as f:
for line in f.readlines():
data=line[:-1].split(',')
x.append(data)
x=np.array(x)
#字符串转数值
label_encoder=[]
x_encoded=np.empty(x.shape)
for i,item in enumerate(x[0]):
label_encoder.append(preprocessing.LabelEncoder())
label_encoder[-1].fit(x[:,i])
x_encoded[:,i]=label_encoder[-1].transform(x[:,i])
x=x_encoded[:, :-1].astype(int)
y=x_encoded[:,-1].astype(int)
#训练分类器
params={'n_estimators':200,'max_depth':8,'random_state':7}
classifier=RandomForestClassifier(**params)
classifier.fit(x,y)
#交叉验证
accuracy=model_selection.cross_val_score(classifier,x,y,scoring='accuracy',cv=3)
print('Accuracy of the classifier(训练器精度):'+str(round(100*accuracy.mean(),2))+'%')
#对单一数据示例进行编码测试
input_data=['high','high','3','4','small','high']
input_data_encoded=[-1]*len(input_data)
for i,item in enumerate(input_data):
input_data_encoded[i]=int(label_encoder[i].transform([input_data[i]]))
input_data_encoded=np.array(input_data_encoded)
print('数组重塑前:',input_data_encoded)
#预测并打印数据点的输出
#重塑数组
input_data_encoded=input_data_encoded.reshape(1,6)
print('数组重塑后:',input_data_encoded)
output_class=classifier.predict(input_data_encoded)
print('Output class(输出类型):',label_encoder[-1].inverse_transform(output_class)[0])
#定义随机森林回归器的超参数
#测试评估器数量参数对分类器的影响
classifier = RandomForestClassifier(max_depth=4, random_state=7)
parameter_grid = np.linspace(25, 200, 8).astype(int)
train_scores, validation_scores = validation_curve(classifier, x, y,
'n_estimators', parameter_grid, cv=5)
print('\n##### 验证曲线 #####')
print('\nParam: n_estimators\nTraining scores:\n', train_scores)
print('\nParam: n_estimators\nValidation scores:\n', validation_scores)
#画图
plt.figure()
plt.plot(parameter_grid, 100*np.average(train_scores, axis=1), color='black')
plt.title(u'Training curve(训练曲线)')
plt.xlabel(u'Number of estimators(评估器数量)')
plt.ylabel(u'Accuracy(准确度)')
plt.show()
#测试最大深度参数对分类器的影响
classifier = RandomForestClassifier(n_estimators=20, random_state=7)
parameter_grid = np.linspace(2, 10, 5).astype(int)
train_scores, valid_scores = validation_curve(classifier, x, y,
'max_depth', parameter_grid, cv=5)
print(u'\nParam: max_depth\nTraining scores:\n', train_scores)
print(u'\nParam: max_depth\nValidation scores:\n', validation_scores)
#画图
plt.figure()
plt.plot(parameter_grid, 100*np.average(train_scores, axis=1), color='black')
plt.title(u'Validation curve(验证曲线)')
plt.xlabel(u'Maximum depth of the tree(树的最大深度)')
plt.ylabel(u'Accuracy(准确度)')
plt.show()
#生成学习曲线
classifier = RandomForestClassifier(random_state=7)
parameter_grid = np.array([200, 500, 800, 1100])
train_sizes, train_scores, validation_scores = learning_curve(classifier,
x, y, train_sizes=parameter_grid, cv=5)
print('\n##### 学习曲线 #####')
print('\nTraining scores:\n', train_scores)
print('\nValidation scores:\n', validation_scores)
#画图
plt.figure()
plt.plot(parameter_grid, 100*np.average(train_scores, axis=1), color='black')
plt.title(u'Learning curve(学习曲线)')
plt.xlabel(u'Number of training samples(训练样本的数量)')
plt.ylabel(u'Accuracy(准确度)')
plt.show()