前言
這學期有幸助研代本科生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])
以上為創建一個簡單線性分類器的代碼,資料檔案的是我自己隨手敲的…如下圖即可:

結果如下圖,

線性回歸訓練結果可視化,

測驗結果可視化,

最后輸出嶺回歸與多項式回歸的量化結果,
最后
我去吃飯了,寫的倉促回頭再改,下次一定!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/380865.html
標籤:AI
上一篇:數字影像相關(Digital Image Correlation, DIC)中的非線性優化方法(FA-GN與IC-GN)
