Tensorflow教程(前二)——多項式迴歸

calong發表於2020-09-30

求解代價函式的方式不止梯度下降法一種,而且梯度下降法需要選擇合適的學習率,需要迭代很多個週期,只能找到最優解的近似值,而標準方程法不需要迭代,不需要選擇學習率,可以得到全域性最優解,但有一點,標準方程法的樣本數量必須大於資料特徵數量。

特徵縮放法

  1. 資料歸一化:當樣本的多個資料特徵之間數量級相差較大時,可以把資料歸一化(將取值範圍處理為0-1或者-1-1之間)
    Tensorflow教程(前二)——多項式迴歸
  2. 均值標準化:
    Tensorflow教程(前二)——多項式迴歸

交叉驗證法

將資料等分成n份,分別編號為0…n,第一次訓練取0…(n-1)為訓練集,n為測試集;第二次訓練取0…(n-2)和n為訓練集,n-1為測試集,依次迭代訓練。

設有m個訓練樣本,每個樣本有n個資料特徵

gKMy120H7z.png

設Y為樣本輸出值

wpZpqtLPuV.png

設擬合函式為: h(x) = θ0 * x0 + θ1 * x1 …. + θn * xn ( 其中x0 = 1)

4LZ8k4FJhU.png

採用均方誤差定好代價函式

r8YxXN7R6o.png

證明過程

  1. 化簡過程
    Tensorflow教程(前二)——多項式迴歸
  2. 求導
    Tensorflow教程(前二)——多項式迴歸
  3. 第一項:
    Tensorflow教程(前二)——多項式迴歸
  4. 第二項:
    Tensorflow教程(前二)——多項式迴歸
  5. 第三項:
    Tensorflow教程(前二)——多項式迴歸
  6. 第四項:
    Tensorflow教程(前二)——多項式迴歸
  7. 結果:
    Tensorflow教程(前二)——多項式迴歸

Tensorflow教程(前二)——多項式迴歸
避免過擬合的方法:

  1. 減少特徵
  2. 增加資料量
  3. 正則化(Regularized)

    嶺迴歸

    Tensorflow教程(前二)——多項式迴歸
    矩陣式:
    Tensorflow教程(前二)——多項式迴歸
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

Tensorflow教程(前二)——多項式迴歸

LASSO函式

Tensorflow教程(前二)——多項式迴歸

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函式

Tensorflow教程(前二)——多項式迴歸

修改的正則部分:

Tensorflow教程(前二)——多項式迴歸

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.        ]

無論是一元線性迴歸還是多元線性迴歸,他們都只能擬合近似直線或單一平面的資料,而多項式迴歸可以擬合更加複雜的函式變化
HRqQTFZVCK.png

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

Tensorflow教程(前二)——多項式迴歸

degree的理解:degree為公式中x的係數,模型通過改變x的值來確定最適合的θ,當函式關係比較複雜時,一次冪函式無論如何都無法進行最適合的擬合,所以通過改變x的係數來建立更加複雜的高次冪函式

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章