1、線性回歸
例如:對于一個房子的價格,其影響因素有很多,例如房子的面積、房子的臥室數量、房子的衛生間數量等等都會影響房子的價格。這些影響因子不妨用 x i x_{i} xi?表示,那么房價 y y y可以用如下公式表示:
y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y=w_1x_1+w_2x_2+w_3x_3+b y=w1?x1?+w2?x2?+w3?x3?+b
其中 w i w_{i} wi?表示特征 i i i的權重, b b b表示偏置,也稱作截距,當然在實際問題中, x i x_i xi?為 0 0 0時 y y y肯定為 0 0 0而不可能為 b b b,但是加上偏置后可以是模型的擬合效果更好。
2、損失的衡量
在分類問題時,我們可以用準確率(預測正確的數量/測試集總樣本數量),而在回歸任務時,衡量誤差的損失函數通常使用均方誤差,設 y ′ y' y′是預測值, y y y是真實值,則損失函數為:
l o s s = 1 n ∑ i = 1 n 1 2 ( y i ′ ? y ) 2 loss = \frac{1}{n}∑_{i=1}^{n} \frac{1}{2}(y'_{i}-y)2 loss=n1?i=1∑n?21?(yi′??y)2
這個又稱作均方誤差,前面的系數 1 2 \frac{1}{2} 21?是為了求導后與平方項的 2 2 2相乘時得到 1 1 1
可知,均方誤差越小,擬合效果越好。反之擬合效果越差。
另外一個重要的衡量指標為 R 2 R^2 R2系數,當 R 2 < 0.3 R^2<0.3 R2<0.3時,擬合能力
3、優化損失
對于損失較大的時候,如何優化權重 w w w和 b b b使其讓我們的均方誤差盡可能的小。這里提供兩種方法。
a)使用正規方程進行優化
b)使用梯度下降進行優化。
正規方程依次即可求得最優解,而梯度下降法需要逐次迭代,尋找出最優解。但是對于大規模的數據集,通常是采用梯度下降進行優化,而正規方程在小規模數據集的優化上表現略由于梯度下降。
4、線性回歸API及其調用
在sklearn中提供了線性回歸的API,根據優化方法不同,分為以下兩種:
sklearn.linear_model.LinearRegression(fit_intercept=True)
通過正規方程進行優化
fit_intercept:是否計算偏置,默認為True,不計算偏置則模型一定過原點
LinearRegression.coef_:回歸系數
LinearRegression。intercept_:偏置sklearn.linear_model.SGDRegressor(loss='squared_loss', fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
loss:損失類型,loss='squared_loss' 普通最小二乘法
fit_intercept:是否計算偏置
learning_rate:學習率
5、線性回歸實例–波士頓房價預測(數據集點我)
RM: 每個住宅的平均房間數
LSTAT: 區域內房東的地位,表示低收入人群的百分比
PTRATIO: 區域內學生和教師的比例
MEDV: 自住房的中位數價值,以千美元為單位
import pandas as pd
data = pd.read_csv('housing.csv',sep=',')
# 檢查是否具有缺失值,全部為False,說明沒有缺失值
pd.isnull(data).any()
# 數據集的切分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data[['RM','LSTAT','PTRATIO']],data.MEDV,train_size=0.8)
# 數據歸一化
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
import matplotlib.pyplot as plt
plt.rcParams['font.family']='STFangsong'
# 創建一個畫布,分成三個繪圖區,查看每個變量和目標值的關系
figure, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 8), dpi=80)
axes[0].scatter(data.RM,data.MEDV)
axes[1].scatter(data.LSTAT,data.MEDV)
axes[2].scatter(data.PTRATIO,data.MEDV)
# 加網格,透明度為0.5
axes[0].grid(linestyle='--',alpha=0.5)
axes[1].grid(linestyle='--',alpha=0.5)
axes[2].grid(linestyle='--',alpha=0.5)
plt.show()
# 采用回歸算法進行預測
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error,r2_score
# 使用正則化進行優化
estimator = LinearRegression(fit_intercept=True)
estimator.fit(x_train, y_train)
y_predict1 = estimator.predict(x_test)
print(f"r方系數為{r2_score(y_predict1,y_test)}")
print(f"方差為:{mean_squared_error(y_predict1,y_test)}")
print(f'優化后的權重參數為:{estimator.coef_},偏置為:{estimator.intercept_}')
from sklearn.linear_model import SGDRegressor
estimator = SGDRegressor(fit_intercept=True)
estimator.fit(x_train, y_train)
y_predict1 = estimator.predict(x_test)
print(f"r方系數為{r2_score(y_predict1,y_test)}")
print(f"方差為:{mean_squared_error(y_predict1,y_test)}")
print(f'優化后的權重參數為:{estimator.coef_},偏置為:{estimator.intercept_}')
觀察可發現使用梯度下降優化的方差較小,可認為其預測的擬合效果更好。