修正《python机器学习经典实例》p38-p45页2.9节《根据汽车特征评估质量》

使用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()








评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值