【1】引言
前序學習進程中,對SVM相關的數學原理進行了探索和推導,相關文章鏈接包括且不限于:
python學智能算法(二十六)|SVM-拉格朗日函數構造-CSDN博客
python學智能算法(二十八)|SVM-拉格朗日函數求解中-KKT條件_python求解kkt條件-CSDN博客
python學智能算法(三十)|SVM-KKT條件的數學理解_dual svm 的 kkt 條件-CSDN博客
python學智能算法(三十六)|SVM-拉格朗日函數求解(中)-軟邊界-CSDN博客
在對數學原理進行測試的過程中,必須用到數據集。由于sklearn有成熟的數據集,因此有必要先對sklearn相關的知識點進行學習和掌握,這樣才有助于快速理解后面的知識。
【2】線性回歸實例解讀
官網學習地址:1.1 線性模型-scikit-learn中文社區
線性回歸計算的本質非常簡單,假設有自變量x=[x1,x2,...,xn] ,因變量$y=[y1,y2}...,yn],線性回歸的目的就是找出一組回歸系數$w=[w1,w2...,wn]$和偏置量b,使得線性方程成立:
$$y(w,x,b)=\sum_{i=1}^{n}w_{i}\cdot x_{i}+b$$
解讀之前,首先給出完整代碼:
# 引入繪圖模塊
import matplotlib.pyplot as plt
# 引入計算模塊
import numpy as np
# 引入數據集和線性模塊
from sklearn import datasets, linear_model
# 計算均方誤差和決定系數
from sklearn.metrics import mean_squared_error, r2_score# Load the diabetes dataset
# 返回二維矩陣diabetes_X,diabetes_X本質是MXN行的矩陣
# 返回一維數組diabetes_y,diabetes_y實際上沒有行向量和列向量的區分
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)# Use only one feature
# 兩個操作,第一個是微數據增加一個新的維度,通過np.newaxis
# 第二個是只提取原本二維矩陣diabetes_X中的第3個特征
# 假如提取原本二維矩陣diabetes_X中的第3個特征是[12,16,18],它們組成了一維數組
# 添加np.newaxis的作用后,獲得新的diabetes_X =[[12],[16],[18]]
diabetes_X = diabetes_X[:, np.newaxis, 2]# Split the data into training/testing sets
# 將diabetes_X 除了最后20個數據之外的部分設置為訓練數據集的特征,也就是因變量
diabetes_X_train = diabetes_X[:-20]
# 將diabetes_X 最后20個數據設置為測試數據集
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets
# 將diabetes_y 除了最后20個數據之外的部分設置為訓練數據集的特征,也就是因變量
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]# Create linear regression object
# 此處觸及線性回歸的本質
# regr表面上只是一個變量名
# 但regr存儲了linear_model.LinearRegression()可以調用的所有方法和屬性
regr = linear_model.LinearRegression()# Train the model using the training sets
# 通過regr可以直接調用linear_model.LinearRegression()類中的fit()方法
# 此處的fit()方法是在diabetes_X_train, diabetes_y_train之間擬合出線性方程
regr.fit(diabetes_X_train, diabetes_y_train)# Make predictions using the testing set
# 將diabetes_X_test代入fit()方法擬合出的線性方程,獲得訓練出來的因變量
diabetes_y_pred = regr.predict(diabetes_X_test)# The coefficients
# 此處直接輸出線性系數,當因變量只有一個,這個數就是直線斜率
print('Coefficients: \n', regr.coef_)
# The mean squared error
# 輸出均方誤差
print('Mean squared error: %.2f'% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'% r2_score(diabetes_y_test, diabetes_y_pred))# Plot outputs
# 繪制訓練值和預測值的對比圖
plt.title('test VS predict')
# 訓練值,也就是實測值
plt.scatter(diabetes_X_test, diabetes_y_test, color='green',label='test')
# 預測值
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3,label='predict')
plt.legend()
plt.xticks(())
plt.yticks(())plt.show()
【2.1】引入必要模塊
# 引入繪圖模塊
import matplotlib.pyplot as plt
# 引入計算模塊
import numpy as np
# 引入數據集和線性模塊
from sklearn import datasets, linear_model
# 計算均方誤差和決定系數
from sklearn.metrics import mean_squared_error, r2_score
這里引入模塊是對sklearn的基本操作,每次使用不同的數據集和執行不同的操作,需要引入不同的sklearn子模塊。
【2.2】數據處理
數據處理部分將數據集劃分為因變量和自變量,再進一步細化為訓練集和測試集。
# Load the diabetes dataset
# 返回二維矩陣diabetes_X,diabetes_X本質是MXN行的矩陣
# 返回一維數組diabetes_y,diabetes_y實際上沒有行向量和列向量的區分
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)# Use only one feature
# 兩個操作,第一個是微數據增加一個新的維度,通過np.newaxis
# 第二個是只提取原本二維矩陣diabetes_X中的第3個特征
# 假如提取原本二維矩陣diabetes_X中的第3個特征是[12,16,18],它們組成了一維數組
# 添加np.newaxis的作用后,獲得新的diabetes_X =[[12],[16],[18]]
diabetes_X = diabetes_X[:, np.newaxis, 2]# Split the data into training/testing sets
# 將diabetes_X 除了最后20個數據之外的部分設置為訓練數據集的特征,也就是因變量
diabetes_X_train = diabetes_X[:-20]
# 將diabetes_X 最后20個數據設置為測試數據集
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets
# 將diabetes_y 除了最后20個數據之外的部分設置為訓練數據集的特征,也就是因變量
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]
整個數據處理代碼段最核心的目的是實現數據結構劃分,適用的最核心代碼是return_X_y=True,這一步起到了承上啟下的作用,經過這一步數據在結構上分成了自變量組diabetes_X和因變量組diabetes_y,然后取這兩組變量的最后20個數據作測試,其余都用于訓練。
【2.3】訓練和測試
# Create linear regression object
# 此處觸及線性回歸的本質
# regr表面上只是一個變量名
# 但regr存儲了linear_model.LinearRegression()可以調用的所有方法和屬性
regr = linear_model.LinearRegression()# Train the model using the training sets
# 通過regr可以直接調用linear_model.LinearRegression()類中的fit()方法
# 此處的fit()方法是在diabetes_X_train, diabetes_y_train之間擬合出線性方程
regr.fit(diabetes_X_train, diabetes_y_train)# Make predictions using the testing set
# 將diabetes_X_test代入fit()方法擬合出的線性方程,獲得訓練出來的因變量
diabetes_y_pred = regr.predict(diabetes_X_test)# The coefficients
# 此處直接輸出線性系數,當因變量只有一個,這個數就是直線斜率
print('Coefficients: \n', regr.coef_)
# The mean squared error
# 輸出均方誤差
print('Mean squared error: %.2f'% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'% r2_score(diabetes_y_test, diabetes_y_pred))# Plot outputs
# 繪制訓練值和預測值的對比圖
plt.title('test VS predict')
# 訓練值,也就是實測值
plt.scatter(diabetes_X_test, diabetes_y_test, color='green',label='test')
# 預測值
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3,label='predict')
plt.legend()
plt.xticks(())
plt.yticks(())plt.show()
代碼運行后的效果為:
【3】總結
通過構造線性回歸實例,初步學習了使用scikitlearn/sklearn模塊進行數據處理的技巧。
?