求解代價函式的方式不止梯度下降法一種,而且梯度下降法需要選擇合適的學習率,需要迭代很多個週期,只能找到最優解的近似值,而標準方程法不需要迭代,不需要選擇學習率,可以得到全域性最優解,但有一點,標準方程法的樣本數量必須大於資料特徵數量。
特徵縮放法
- 資料歸一化:當樣本的多個資料特徵之間數量級相差較大時,可以把資料歸一化(將取值範圍處理為0-1或者-1-1之間)
- 均值標準化:
交叉驗證法
將資料等分成n份,分別編號為0…n,第一次訓練取0…(n-1)為訓練集,n為測試集;第二次訓練取0…(n-2)和n為訓練集,n-1為測試集,依次迭代訓練。
設有m個訓練樣本,每個樣本有n個資料特徵
設Y為樣本輸出值
設擬合函式為: h(x) = θ0 * x0 + θ1 * x1 …. + θn * xn ( 其中x0 = 1)
採用均方誤差定好代價函式
證明過程
- 化簡過程
- 求導
- 第一項:
- 第二項:
- 第三項:
- 第四項:
- 結果:
避免過擬合的方法:
import numpy as np
import matplotlib.pyplot as plt
from numpy import genfromtxt
from sklearn import linear_model
# 讀取資料
data = genfromtxt(r'E:/project/python/data/csv/longley.csv', delimiter=',')
x_data = data[1:, 2:]
y_data = data[1:, 1]
alphas_to_test = np.linspace(0.001, 1)
model = linear_model.RidgeCV(alphas=alphas_to_test, store_cv_values=True)
model.fit(x_data, y_data)
# 嶺係數
print(model.alpha_)
# 畫圖
plt.plot(alphas_to_test, model.cv_values_.mean(axis=0))
plt.plot(model.alpha_, min(model.cv_values_.mean(axis=0)), 'ro')
plt.show()
# 列印結果
0.40875510204081633
LASSO函式
from numpy import genfromtxt
from sklearn import linear_model
# 讀取資料
data = genfromtxt(r'E:/project/python/data/csv/longley.csv', delimiter=',')
x_data = data[1:, 2:]
y_data = data[1:, 1]
model = linear_model.LassoCV()
model.fit(x_data, y_data)
# LASSO係數
print(model.alpha_)
# 相關係數
print(model.coef_)
# 列印結果
14.134043936116361
[0.10093575 0.00586331 0.00599214 0. 0. 0. ]
彈性網:結合嶺迴歸和LASSO函式
修改的正則部分:
from numpy import genfromtxt
from sklearn import linear_model
# 讀取資料
data = genfromtxt(r'E:/project/python/data/csv/longley.csv', delimiter=',')
x_data = data[1:, 2:]
y_data = data[1:, 1]
model = linear_model.ElasticNetCV()
model.fit(x_data, y_data)
# LASSO係數
print(model.alpha_)
# 相關係數
print(model.coef_)
# 列印結果
30.31094405430269
[0.1006612 0.00589596 0.00593021 0. 0. 0. ]
無論是一元線性迴歸還是多元線性迴歸,他們都只能擬合近似直線或單一平面的資料,而多項式迴歸可以擬合更加複雜的函式變化
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
data = np.genfromtxt(r'E:/project/python/data/csv/job.csv', delimiter=',')
x_data = data[1:, 1, np.newaxis]
y_data = data[1:, 2, np.newaxis]
# 定義多項式迴歸
ploy_reg = PolynomialFeatures(degree=5)
# 特徵處理
x_ploy = ploy_reg.fit_transform(x_data)
lin_reg = LinearRegression()
lin_reg.fit(x_ploy, y_data)
# 畫圖
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, lin_reg.predict(ploy_reg.transform(x_data)), c='r')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()
degree的理解:degree為公式中x的係數,模型通過改變x的值來確定最適合的θ,當函式關係比較複雜時,一次冪函式無論如何都無法進行最適合的擬合,所以通過改變x的係數來建立更加複雜的高次冪函式
本作品採用《CC 協議》,轉載必須註明作者和本文連結