線性回歸+回歸算法的評(píng)價(jià)指標(biāo)
- 回歸問題的判定
- 目標(biāo)值是連續(xù)性的值疹鳄,而分類問題的目標(biāo)值是離散型的值。
- 回歸處理的問題為預(yù)測(cè):
- 預(yù)測(cè)房?jī)r(jià)
- 銷售額的預(yù)測(cè)
- 設(shè)定貸款額度
- 總結(jié):上述案例中牵舱,可以根據(jù)事物的相關(guān)特征預(yù)測(cè)出對(duì)應(yīng)的結(jié)果值
- 線性回歸在生活中的映射(現(xiàn)實(shí)生活中就有線性回歸):生活案例【預(yù)測(cè)學(xué)生的期末成績(jī)】:
- 期末成績(jī)的制定:0.7*考試成績(jī)+0.3平時(shí)成績(jī)干像,則該例子中图贸,特征值為考試成績(jī)和平時(shí)成績(jī),目標(biāo)值為總成績(jī)乾闰。
- 回歸算法預(yù)測(cè)出來的結(jié)果其實(shí)就是經(jīng)過相關(guān)的算法計(jì)算出來的結(jié)果值落追!
- 每一個(gè)特征需要有一個(gè)權(quán)重的占比,這個(gè)權(quán)重的占比明確后涯肩,則就可以得到最終的計(jì)算結(jié)果轿钠,也就是獲取了最終預(yù)測(cè)的結(jié)果了巢钓。
- 那么這個(gè)特征對(duì)應(yīng)的權(quán)重如何獲取或者如何制定呢?
- 期末成績(jī)的制定:0.7*考試成績(jī)+0.3平時(shí)成績(jī)干像,則該例子中图贸,特征值為考試成績(jī)和平時(shí)成績(jī),目標(biāo)值為總成績(jī)乾闰。
#現(xiàn)在有一組售房的數(shù)據(jù)
import numpy as np
import pandas
from pandas import DataFrame
import matplotlib.pylab as plt
dic = {
'面積':[55,76,80,100,120,150],
'售價(jià)':[110,152,160,200,240,300]
}
df = DataFrame(data=dic)
df
#輸出結(jié)果:
面積 售價(jià)
0 55 110
1 76 152
2 80 160
3 100 200
4 120 240
5 150 300
對(duì)售房數(shù)據(jù)的分布情況進(jìn)行展示
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題
plt.scatter(df['面積'],df['售價(jià)'])
plt.xlabel('面積')
plt.ylabel('售價(jià)')
plt.title('面積和價(jià)錢的分布圖')
散點(diǎn)圖:
plt.scatter(df['面積'],df['售價(jià)'])
plt.xlabel('面積')
plt.ylabel('售價(jià)')
plt.title('面積和價(jià)錢的分布圖')
plt.scatter(np.linspace(0,180,num=100),np.linspace(0,180,num=100)*2,alpha=0.3)
情況1:散點(diǎn)在所有直線上
線性方程圖:y=2*x
線性回歸的作用:找出特征和目標(biāo)之間存在的某種趨勢(shì)
該趨勢(shì)表示形式:線性方程
? 線性方程y = wx就可以表示一條唯一的直線
? 標(biāo)準(zhǔn)的線性方程式為:y = wx + b,w為斜率疗垛,b為截距
? 何時(shí)帶b: 加b的目的是為了使得趨勢(shì)對(duì)應(yīng)的直線更加具有通用性
? 分情況: 目標(biāo)值有可能為0(直線過原點(diǎn))症汹,帶b,否則不帶b
-
房?jī)r(jià)受影響的因素除了面積了贷腕,加入了采光率和樓層了背镇,特征變成3種。在原始的線性方程y=wx+b中只可以有一個(gè)特征泽裳,則該方程不具備通用性瞒斩。
標(biāo)準(zhǔn)線性關(guān)系模型為:
售價(jià) = (w1面積+w2采光率+w3樓層)+ b==》y = (w1x1w2x2+wn*xn)+b
w叫做權(quán)重。
-
b可以變換成w0*x0,x0=1
- y = w0x0+w1x1+w2x2+wnxn
-
權(quán)重向量(行向量):w0,w1,...wn
- 行向量的轉(zhuǎn)置就是列向量诡壁。行向量是一個(gè) n×1 的矩陣济瓢,即矩陣由一個(gè)含有n個(gè)元素的行所組成。
行向量乘以行向量的轉(zhuǎn)置為一個(gè)常數(shù)
線性回歸
- 找出特征和特征權(quán)重之間的一種組合妹卿,預(yù)測(cè)對(duì)應(yīng)的結(jié)果
- 線性方程式:
- 真實(shí)結(jié)果和預(yù)測(cè)結(jié)果是否會(huì)存在誤差
若在房?jī)r(jià)預(yù)測(cè)案例中旺矾,特征與目標(biāo)之間的分布規(guī)律不是線性的,也可以使用一條直線表示特征和目標(biāo)之間的趨勢(shì)夺克,但是要保證直線距離所有的散點(diǎn)距離最近箕宙,該直線還是可以在一定程度上表示非線性分布散點(diǎn)之間的分布規(guī)律。但是該規(guī)律會(huì)存在誤差
-
處理誤差:
-
回歸算法
回歸算法是一個(gè)迭代算法铺纽。迭代就好比是系統(tǒng)版本的迭代柬帕,迭代后的系統(tǒng)要比迭代前的系統(tǒng)更好。
- 回歸算法就是在不斷的自身迭代的減少誤差來使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果
- 官方解釋:迭代是重復(fù)反饋過程的活動(dòng)狡门,其目的通常是為了逼近所需目標(biāo)或結(jié)果陷寝。每一次對(duì)過程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值其馏。
誤差的處理方法
回歸算法就是在不斷的自身迭代的減少誤差來使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果
損失函數(shù) 來表示誤差
總損失.png -
- yi:為第i個(gè)訓(xùn)練樣本的真實(shí)值
- hw(xi):預(yù)測(cè)值
損失函數(shù):

又稱為SSE(Sum of Sqaured Error凤跑,誤差平方和)或者RSS(Residual Sum of Squares 殘差平方和)
由上式知,誤差的大小線性回歸方程中的系數(shù)w是有直系關(guān)聯(lián)的:w(權(quán)重)的不同會(huì)導(dǎo)致誤差大小的不同
- L0叛复,L1和L2范式:
- L0是指向量中非0的元素的個(gè)數(shù)仔引。
- L1是指向量中各個(gè)元素絕對(duì)值之和。
- L2是指向量各元素的平方和然后求平方根
- 本質(zhì)是就是歐式距離褐奥,即是兩個(gè)向量上的每個(gè)點(diǎn)對(duì)應(yīng)相減后的平方和再開平方
- 損失函數(shù):歐式距離的平方
損失函數(shù)是在計(jì)算真實(shí)標(biāo)簽和預(yù)測(cè)值之間的距離咖耘,差異越小越好 ,故求:

最小二乘法 :通過最小化真實(shí)值和預(yù)測(cè)值之間的RSS來求解參數(shù)的方法 撬码。 求解極值(最小值)就是求解一階導(dǎo)數(shù)并讓一階導(dǎo)數(shù)等于0
L2范式求導(dǎo)
參考點(diǎn):
1.兩個(gè)向量(y&Xw)的平方就等于兩個(gè)向量的轉(zhuǎn)置乘以兩個(gè)向量本身
2.處理轉(zhuǎn)置乘法和減法
- 在矩陣求導(dǎo)中如果小a為常數(shù)項(xiàng)儿倒,A為矩陣則
-
API
最小二乘(正規(guī)方程):from sklearn.linear_model import LinearRegression
最小二乘法 : 參數(shù)中并沒有一個(gè)是必填的
最小二乘法.png
sklearn中的線性回歸可以處理多標(biāo)簽問題,只需要在fit的時(shí)候輸入多維度標(biāo)簽就可以了
normalize參數(shù):如果為True呜笑,則會(huì)對(duì)特征數(shù)據(jù)進(jìn)行歸一化處理义桂,如果想對(duì)特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理則需要在訓(xùn)練模型前調(diào)用相關(guān)工具類對(duì)其進(jìn)行標(biāo)準(zhǔn)化處理找筝。
- 使用最小二乘對(duì)加利福尼亞房屋進(jìn)行預(yù)測(cè)
- 特征介紹:
- AveBedrms:該街區(qū)平均的臥室數(shù)目
- Population:街區(qū)人口
- AveOccup:平均入住率
- Latitude:街區(qū)的緯度
- Longitude:街區(qū)的經(jīng)度
- MedInc:街區(qū)住戶收入的中位數(shù)
- HouseAge:房屋使用年數(shù)中位數(shù)
- AveRooms:街區(qū)平均房屋的數(shù)量
from sklearn.linear_model import LinearRegression
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split
#獲取數(shù)據(jù)
house = datasets.fetch_california_housing(data_home='./datasets')
#樣本數(shù)據(jù)提取
feature = house.data
target = house.target
feature.shape #(20640, 8)
#回歸模型一般情況下不需要做特征的預(yù)處理,如果最終模型預(yù)測(cè)效果不好慷吊,可以適當(dāng)考慮加上預(yù)處理
#數(shù)據(jù)集的切分
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2020)
#最小二乘
linner = LinearRegression(normalize=True,copy_X=False)
linner.fit(x_train,y_train)
#查看特征的權(quán)重系數(shù)
linner.coef_
#輸出結(jié)果:
array([ 4.40832770e-01, 9.61642244e-03, -1.14781227e-01, 6.75973842e-01,
-5.10337874e-06, -3.47558983e-03, -4.19478386e-01, -4.32477249e-01])
#截距
linner.intercept_ #-36.77944310594463
#獲取特征名稱
feature_names = house.feature_names
#將系數(shù)和特征名稱結(jié)合在一起查看
[*zip(feature_names,linner.coef_)]
#輸出結(jié)果:
[('MedInc', 0.4408327703951707),
('HouseAge', 0.009616422444042731),
('AveRooms', -0.11478122746959658),
('AveBedrms', 0.6759738423151275),
('Population', -5.1033787395895275e-06),
('AveOccup', -0.003475589832443694),
('Latitude', -0.41947838567694423),
('Longitude', -0.4324772490416935)]
#預(yù)測(cè)
linner.score(x_test,y_test) #0.6077878946185034
回歸模型的評(píng)價(jià)指標(biāo)
- 回歸類與分類型算法的模型評(píng)估都有相似的法則— —找真實(shí)標(biāo)簽和預(yù)測(cè)值的差異袖裕。只不過在分類型算法中,這個(gè)差異只有一種角度來評(píng)判溉瓶,那就是是否預(yù)測(cè)到了正確的分類急鳄,而在回歸類算法中,有兩種不同的角度來看待回歸的效果:
- 第一堰酿,是否預(yù)測(cè)到了正確或者接近正確的數(shù)值(因?yàn)檎`差的存在)疾宏。
- 第二,是否擬合到了足夠的信息触创。(是否模型預(yù)測(cè)的結(jié)果線性和樣本真實(shí)的結(jié)果的線性更加吻合)
- 這兩種角度坎藐,分別對(duì)應(yīng)著不同的模型評(píng)估指標(biāo)。
1.是否預(yù)測(cè)到了正確的數(shù)值
- RSS殘差平方和 哼绑,本質(zhì)是預(yù)測(cè)值與真實(shí)值之間的差異
致命缺點(diǎn): 它是一個(gè)無界的和岩馍,可以無限地大或者無限的小
-
MSE 均方誤差
MSE.png
本質(zhì)是在RSS的基礎(chǔ)上除以樣本總量,得到每個(gè)樣本量上的平均誤差
查看這個(gè)錯(cuò)誤有多嚴(yán)重 :比較平均誤差和標(biāo)簽的取值范圍(最大值和最小值) ( 最大值和最小值可以表示標(biāo)簽的一個(gè)分部情況 )
- 在sklearn當(dāng)中抖韩,有兩種方式調(diào)用這個(gè)評(píng)估指標(biāo):
- 一種是使用sklearn專用的模型評(píng)估模塊metrics里的類mean_squared_error
- 另一種是調(diào)用交叉驗(yàn)證的類cross_val_score并使用里面的scoring參數(shù)來設(shè)置為:neg_mean_squared_error使用均方誤差蛀恩。
方式1:
from sklearn.metrics import mean_squared_error as MSE
#y_true:測(cè)試數(shù)據(jù)的真實(shí)標(biāo)簽
#y_pred:使用模型對(duì)測(cè)試集的預(yù)測(cè)結(jié)果
y_pred = linner.predict(x_test)
MSE(y_test,y_pred) #0.5313973307052253
y_test.min(),y_test.max() #(0.14999, 5.00001)
方式2:
from sklearn.model_selection import cross_val_score
cross_val_score(linner,x_train,y_train,cv=5,scoring='neg_mean_squared_error').mean() #-0.5309250456411233
交叉驗(yàn)證求得的均方誤差為負(fù)值
均方誤差的計(jì)算公式中求得的均方誤差的值不可能為負(fù)。但是sklearn中的參數(shù)scoring下茂浮,均方誤差作為評(píng)判標(biāo)準(zhǔn)時(shí)双谆,卻是計(jì)算”負(fù)均方誤差“(neg_mean_squared_error)。這是因?yàn)閟klearn在計(jì)算模型評(píng)估指標(biāo)的時(shí)候席揽,會(huì)考慮指標(biāo)本身的性質(zhì)顽馋,均方誤差本身是一種誤差,所以被sklearn劃分為模型的一種損失(loss)幌羞。在sklearn當(dāng)中寸谜,所有的損失都使用負(fù)數(shù)表示,因此均方誤差也被顯示為負(fù)數(shù)了新翎。真正的均方誤差MSE的數(shù)值,其實(shí)就是neg_mean_squared_error去掉負(fù)號(hào)的數(shù)字住练。
-
絕對(duì)值誤差(了解)
- 除了MSE地啰,我們還有與MSE類似的MAE(Mean absolute error,絕對(duì)均值誤差):
-
其表達(dá)的概念與均方誤差完全一致讲逛,不過在真實(shí)標(biāo)簽和預(yù)測(cè)值之間的差異外我們使用的是L1范式(絕對(duì)值)】髁撸現(xiàn)實(shí)使用中,MSE和MAE選一個(gè)來使用就好了盏混。
- 在sklearn當(dāng)中蔚鸥,我們使用命令:from sklearn.metrics import mean_absolute_error來調(diào)用MAE
- 同時(shí)惜论,我們也可以使用交叉驗(yàn)證中的scoring = "neg_mean_absolute_error", 以此在交叉驗(yàn)證時(shí)調(diào)用MAE止喷。
2.是否擬合到了足夠的信息
紅色線是真實(shí)標(biāo)簽馆类,藍(lán)色線是模型預(yù)測(cè)的值
前半部分的擬合非常成功 , 但后半部分的擬合卻非常糟糕
方差來衡量數(shù)據(jù)上的信息量 , 如果方差越大,代表數(shù)據(jù)上的信息量越多弹谁,而這個(gè)信息量(數(shù)據(jù)潛在的規(guī)律)不僅包括了數(shù)值的大小乾巧,還包括了我們希望模型捕捉的那些規(guī)律。R2:衡量模型對(duì)數(shù)據(jù)上的信息量的捕捉
1-我們的模型沒有捕捉到的信息量占真實(shí)標(biāo)簽中所帶的信息量的比例
分母是不變的预愤,則誤差越小則分子分母表達(dá)式返回的結(jié)果越小沟于,則r2越接近1.
-
可以使用三種方式來調(diào)用
- 一種是直接從metrics中導(dǎo)入r2_score,輸入預(yù)測(cè)值和真實(shí)值后打分植康。
- 第二種是直接從 線性回歸LinearRegression的接口score來進(jìn)行調(diào)用旷太。
- 第三種是在交叉驗(yàn)證中,輸入"r2"來調(diào)用销睁。
from sklearn.metrics import r2_score
r2_score(y_test,y_pred) #0.6077878946185034
- 繪制擬合圖
%matplotlib inline
import matplotlib.pyplot as plt
y_pred = linner.predict(x_test)
plt.plot(range(len(y_test)),sorted(y_test),c="black",label= "y_true")
plt.plot(range(len(y_pred)),sorted(y_pred),c="red",label = "y_predict")
plt.legend()
plt.show()
可見供璧,雖然我們的大部分?jǐn)?shù)據(jù)被擬合得比較好,但是圖像的開頭和結(jié)尾處卻又著較大的擬合誤差榄攀。如果我們?cè)趫D像右側(cè)分布著更多的數(shù)據(jù)嗜傅,我們的模型就會(huì)越來越偏離我們真正的標(biāo)簽。這種結(jié)果類似于我們前面提到的檩赢,雖然在有限的數(shù)據(jù)集上將數(shù)值預(yù)測(cè)正確了吕嘀,但卻沒有正確擬合數(shù)據(jù)的分布,如果有更多的數(shù)據(jù)進(jìn)入我們的模型贞瞒,那數(shù)據(jù)標(biāo)簽被預(yù)測(cè)錯(cuò)誤的可能性是非常大的偶房。
實(shí)戰(zhàn)
- 房地產(chǎn)估價(jià)數(shù)據(jù)集數(shù)據(jù)集(house.xlsx)
- 數(shù)據(jù)集信息:
- 房地產(chǎn)估值的市場(chǎng)歷史數(shù)據(jù)集來自臺(tái)灣新北市新店區(qū)【“房地產(chǎn)估價(jià)” 是一個(gè)回歸問題棕洋。
- 屬性信息:
- 輸入如下:
- X1 =交易日期(例如,2013.250 = 2013年3月乒融,2013.500 = 2013年6月掰盘,等等)
- X2 =房屋年齡(單位:年)
- X3 =到最近的捷運(yùn)站的距離(單位:米) )
- X4 =步行生活圈中的便利店的數(shù)量(整數(shù))
- X5 =地理坐標(biāo),緯度赞季。(單位:度)
- X6 =地理坐標(biāo)愧捕,經(jīng)度。(單位:度)
- 輸出結(jié)果如下:
- Y =單位面積的房?jī)r(jià)(10000新臺(tái)幣/ Ping申钩,其中Ping是本地單位次绘,1 Ping = 3.3米平方)
- 輸入如下:
- 數(shù)據(jù)集信息: