目標值(因變量)是連續型數據,通過某種函數關係找到因變量和自變量之間的關係,進而預測目標。
通過不斷擬合縮小預測值與真實值的差距:最終使得這個差距(誤差項)成為一組均值為0,方差為1的隨機數。2、損失函數總損失定義為:說明:
優化模型的目標就是如何儘可能的減少損失。
3、優化算法使得損失函數值達到最小的方法:正規方程、梯度下降。
正規方程右上角的-1表示逆矩陣(np.linalg.inv(X))w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)梯度下降理解:a為學習速率,需要手動指定的超參數,a旁邊的的整體表示方向,沿著這個函數的下降的方向找,最終山谷的最低點,然後更新w值使用。其中a設置過大可能會只找到局部最優解。
sklearn.linear_model.LinearRegressiont(fit_intercept=True)
fit_intercept:True/False,是否計算偏置(截距)LinearRegression.coef_:返回回歸係數LinearRegression.intercept_:返回偏置(截距)梯度下降法計算sklearn.linear_model.SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate ="invscaling",eta0=0.01)
SGDRegressor類實現了隨機梯度下降學習優化,它支持不同的loss函數和正則化懲罰項來擬合線性回歸模型。loss="squared_loss":普通最小二乘法fit_intercept:是否計算偏置(截距) True/Falselearning_rate: 迭代過程中學習率的計算方式:"optimal":eta=1.0/(alpha*(t+t0))[default]"invscaling":eta=eta0/pow(t,power_t),power_t=0.25:存在父類當中對於一個常數值的學習率來說,可以使用learning_rate='constant',並使用eta0來指定學習率。SGDRegressor.coef_:返回回歸係數SGDRegressor.intercept_:返回偏置更多:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor.html6、機器學習中回歸性能評估均方誤差(MSE)越小,模型相對越好。其中m為樣本數,y_i為預測值,y~為真實值。
嶺回歸,其實也是一種線性回歸。只不過在篩法建立回歸方程時候,加上L2正則化的限制,從而達到解決過擬合的效果。
sklearn.linear_model.Ridge(alpha=1.0,fit_intercept=True,solver=「auto」,nomalize=False)alpha:正則化力度,懲罰項係數(𝜆)。正則化力度越大,權重係數會越小,正則化力度越小,權重係數會越大。取值:0~1,1~10sag:如果數據集、特徵都比較大,選擇隨機梯度下降優化normalize=False:可以在fit之前調用preprocessing.StandardScaler標準化數據,自動對數據進行標準化Ridge.intercept_:回歸偏置(截距)更多:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html9、案例代碼import numpy as np
import pandas as pd
from sklearn.datasets import load_boston #sklearn波士頓房價預測數據接口
from sklearn.model_selection import train_test_split #劃分數據集
from sklearn.preprocessing import StandardScaler #數據標準化
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge #預估器(正規方程)、預估器(梯度下降學習)、嶺回歸
from sklearn.metrics import mean_squared_error #均方誤
import joblib #模型的加載與保存
def linear1():
"""
正規方程的優化方法對波士頓房價進行預測
:return:
"""
# 1)獲取數據
boston = load_boston()#sklearn波士頓房價預測數據
# 2)劃分數據集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)正規方程-預估器
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 5)得出模型
print("正規方程-回歸係數為:\n", estimator.coef_)
print("正規方程-截距(偏置)為:\n", estimator.intercept_)
# 6)模型評估
y_predict = estimator.predict(x_test)
# print("預測房價:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("正規方程-均方誤差為:\n", error)
return None
def linear2():
"""
梯度下降的優化方法對波士頓房價進行預測
:return:
"""
# 1)獲取數據
boston = load_boston()
print("特徵數量:\n", boston.data.shape)
# 2)劃分數據集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)梯度下降-預估器
estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000, penalty="l1")
estimator.fit(x_train, y_train)
# 5)得出模型
print("梯度下降-回歸係數為:\n", estimator.coef_)
print("梯度下降-截距為:\n", estimator.intercept_)
# 6)模型評估
y_predict = estimator.predict(x_test)
# print("預測房價:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("梯度下降-均方誤差為:\n", error)
return None
def linear3():
"""
嶺回歸對波士頓房價進行預測
:return:
"""
# 1)獲取數據
boston = load_boston()
print("特徵數量:\n", boston.data.shape)
# 2)劃分數據集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4) 嶺回歸-預估器
estimator = Ridge(alpha=0.5, max_iter=10000)
estimator.fit(x_train, y_train)
# 保存模型
joblib.dump(estimator, "my_ridge.pkl")
# 加載模型 使用時註銷 4)預估器 和 保存模型
# estimator = joblib.load("my_ridge.pkl")
# 5)得出模型
print("嶺回歸-權重係數為:\n", estimator.coef_)
print("嶺回歸-偏置(截距)為:\n", estimator.intercept_)
# 6)模型評估
y_predict = estimator.predict(x_test)
# print("預測房價:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("嶺回歸-均方誤差為:\n", error)
return None
if __name__ == "__main__":
# 代碼1:正規方程的優化方法對波士頓房價進行預測
linear1()
# 代碼2:梯度下降的優化方法對波士頓房價進行預測
linear2()
# 代碼3:嶺回歸對波士頓房價進行預測
linear3()