前言
这学期有幸助研代本科生Machine Learning的coding课(其实累死了,还得备课还得盯着)。刚得知今天的课不用上了真是松了一口气,终于不用每周二中午睡不踏实了。
虽然但是,这次代课的经历还是不错的,我的臭脸属性在代课的过程中不能说发挥得淋漓尽致也只能说更上一层楼了。稍微整理一下跟学生们一起学习的过程,作为纪念吧。
相关及配置
- 本系列内容均为*Python机器学习经典实例(Prateek Joshi著)与机器学习(周志华 著)*的学习记录。
- IDE:Pycharm or Spyder
- Python:3.6-3.8
回归
线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型(nonlinear model)可在线性模型的基础上通过引入层级结构或高维映射而得。
以上是“西瓜书”里对线性回归模型的开篇介绍。
话不多说,创建一个简单的线性分类器,并创建岭回归器以及多项式回归器进行结果比较。
```python
import numpy as np
#调用线性回归模型
from sklearn import linear_model
#数据可视化
import matplotlib.pyplot as plt
#计算准确性
import sklearn.metrics as sm
#保存模型,python3中cPickle包已被替换
#import cPickle as pickle
import _pickle as pickle
#多项式回归
from sklearn.preprocessing import PolynomialFeatures
#读取数据文件,这里我改为了直接用相对路径文件名读取
#filename = sys.argv[1]
filename = 'data_singlevar'
x = []
y = []
#x,y为变量,其中x为data,y为lable。使用逗号解析每行数据用逗号分割字段。
with open (filename,'r') as f:
for line in f.readlines():
xt, yt = [float(i) for i in line.split(',')]
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,1))
y_train = np.array(y[:num_training])
#测试数据
x_test = np.array(x[num_training:]).reshape((num_test,1))
y_test = np.array(y[num_training:])
#创建线性回归对象
linear_regressor = linear_model.LinearRegression()
#使用数据集训练模型
linear_regressor.fit(x_train, y_train)
#将拟合过程可视化
y_train_pred = linear_regressor.predict(x_train)
plt.figure
plt.scatter(x_train, y_train, color ='green')
plt.plot(x_train, y_train_pred, color='black', linewidth=4)
plt.show()
#测试模型的泛用性
y_test_pred = linear_regressor.predict(x_test)
plt.scatter(x_test, y_test, color ='green')
plt.plot(x_test, y_test_pred, color='black', linewidth=4)
plt.show()
#计算回归准确性
print("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred), 2))
print("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred), 2))
print("Median absolute error =", round(sm.median_absolute_error(y_test, y_test_pred), 2))
print("Explained variance score =", round(sm.explained_variance_score(y_test, y_test_pred), 2))
print("R2 score =", round(sm.r2_score(y_test, y_test_pred), 2))
#保存模型数据
output_model_file = 'saved_model.pkl'
#'w'改成'wb'
with open(output_model_file,'wb') as f:
pickle.dump(linear_regressor, f)
#加载并使用保存好的模型
#'r'改成'rb'
with open(output_model_file, 'rb') as f:
model_linregr = pickle.load(f)
y_test_pred_new = model_linregr.predict(x_test)
print('\nNew mean absolute error = ',round(sm.mean_absolute_error(y_test, y_test_pred_new),2))
#初始化岭回归器
ridge_regressor = linear_model.Ridge(alpha=0.01, fit_intercept=True, max_iter=10000)
#训练岭回归器
ridge_regressor.fit(x_train, y_train)
y_test_pred_ridge = ridge_regressor.predict(x_test)
print("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred_ridge), 2))
print("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred_ridge), 2))
print("Median absolute error =", round(sm.median_absolute_error(y_test, y_test_pred_ridge), 2))
print("Explain variance score =", round(sm.explained_variance_score(y_test, y_test_pred_ridge), 2) )
print("R2 score =", round(sm.r2_score(y_test, y_test_pred_ridge), 2))
#训练多项式回归器
polynomial = PolynomialFeatures(degree=3)
x_train_transformed = polynomial.fit_transform(x_train)
#检测多项式回归器是否能准确预测
datapoint = [0.39,2.78,7.11]
datapoint = np.array(datapoint).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])
以上为创建一个简单线性分类器的代码,数据文件的是我自己随手敲的…如下图即可:
结果如下图,
线性回归训练结果可视化,
测试结果可视化,
最后输出岭回归与多项式回归的量化结果。
最后
我去吃饭了,写的仓促回头再改,下次一定!