線性回歸+回歸算法的評(píng)價(jià)指標(biāo)

線性回歸+回歸算法的評(píng)價(jià)指標(biāo)

  • 回歸問(wèn)題的判定
    • 目標(biāo)值是連續(xù)性的值,而分類問(wèn)題的目標(biāo)值是離散型的值。
  • 回歸處理的問(wèn)題為預(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è)出來(lái)的結(jié)果其實(shí)就是經(jīng)過(guò)相關(guān)的算法計(jì)算出來(lái)的結(jié)果值!
      • 每一個(gè)特征需要有一個(gè)權(quán)重的占比,這個(gè)權(quán)重的占比明確后,則就可以得到最終的計(jì)算結(jié)果,也就是獲取了最終預(yù)測(cè)的結(jié)果了。
        • 那么這個(gè)特征對(duì)應(yīng)的權(quán)重如何獲取或者如何制定呢?
#現(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)'-'顯示為方塊的問(wèn)題

plt.scatter(df['面積'],df['售價(jià)'])
plt.xlabel('面積')
plt.ylabel('售價(jià)')
plt.title('面積和價(jià)錢的分布圖')

散點(diǎn)圖:

散點(diǎn)圖.png
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

直線圖.png

線性回歸的作用:找出特征和目標(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(直線過(guò)原點(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é)果
    • 線性方程式:
線性回歸方程式.png
  • 真實(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)更好。

      • 回歸算法就是在不斷的自身迭代的減少誤差來(lái)使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果
      • 官方解釋:迭代是重復(fù)反饋過(guò)程的活動(dòng),其目的通常是為了逼近所需目標(biāo)或結(jié)果。每一次對(duì)過(guò)程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值。
    • 誤差的處理方法

    • 回歸算法就是在不斷的自身迭代的減少誤差來(lái)使得回歸算法的預(yù)測(cè)結(jié)果可以越發(fā)的逼近真實(shí)結(jié)果

    • 損失函數(shù) 來(lái)表示誤差

    總損失.png
    - yi:為第i個(gè)訓(xùn)練樣本的真實(shí)值

    - hw(xi):預(yù)測(cè)值

       損失函數(shù):

    ![損失函數(shù).png](https://upload-images.jianshu.io/upload_images/20605284-d2d60973738b85a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


    又稱為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)相減后的平方和再開(kāi)平方

        - 損失函數(shù):歐式距離的平方 

          損失函數(shù)是在計(jì)算真實(shí)標(biāo)簽和預(yù)測(cè)值之間的距離,差異越小越好 ,故求:

         ![L2范式.png](https://upload-images.jianshu.io/upload_images/20605284-750eacb89f941ac7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



          最小二乘法 :通過(guò)最小化真實(shí)值和預(yù)測(cè)值之間的RSS來(lái)求解參數(shù)的方法 。 求解極值(最小值)就是求解一階導(dǎo)數(shù)并讓一階導(dǎo)數(shù)等于0 

L2范式求導(dǎo)

w.gif

參考點(diǎn):

1.兩個(gè)向量(y&Xw)的平方就等于兩個(gè)向量的轉(zhuǎn)置乘以兩個(gè)向量本身

2.處理轉(zhuǎn)置乘法和減法

處理轉(zhuǎn)置乘法和減法.png
  1. 在矩陣求導(dǎo)中如果小a為常數(shù)項(xiàng),A為矩陣則
矩陣求導(dǎo).png
  • API

    最小二乘(正規(guī)方程):from sklearn.linear_model import LinearRegression

    最小二乘法 : 參數(shù)中并沒(méi)有一個(gè)是必填的

    最小二乘法.png

sklearn中的線性回歸可以處理多標(biāo)簽問(wèn)題,只需要在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è)值的差異。只不過(guò)在分類型算法中,這個(gè)差異只有一種角度來(lái)評(píng)判,那就是是否預(yù)測(cè)到了正確的分類,而在回歸類算法中,有兩種不同的角度來(lái)看待回歸的效果:
    • 第一,是否預(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è)無(wú)界的和,可以無(wú)限地大或者無(wú)限的小

  • 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ù)來(lái)設(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ì)均值誤差):
MAE.png
  • 其表達(dá)的概念與均方誤差完全一致,不過(guò)在真實(shí)標(biāo)簽和預(yù)測(cè)值之間的差異外我們使用的是L1范式(絕對(duì)值)。現(xiàn)實(shí)使用中,MSE和MAE選一個(gè)來(lái)使用就好了。

    • 在sklearn當(dāng)中,我們使用命令:from sklearn.metrics import mean_absolute_error來(lái)調(diào)用MAE
    • 同時(shí),我們也可以使用交叉驗(yàn)證中的scoring = "neg_mean_absolute_error", 以此在交叉驗(yàn)證時(shí)調(diào)用MAE。

2.是否擬合到了足夠的信息

擬合.png

紅色線是真實(shí)標(biāo)簽,藍(lán)色線是模型預(yù)測(cè)的值

前半部分的擬合非常成功 , 但后半部分的擬合卻非常糟糕

方差來(lái)衡量數(shù)據(jù)上的信息量 , 如果方差越大,代表數(shù)據(jù)上的信息量越多,而這個(gè)信息量(數(shù)據(jù)潛在的規(guī)律)不僅包括了數(shù)值的大小,還包括了我們希望模型捕捉的那些規(guī)律。R2:衡量模型對(duì)數(shù)據(jù)上的信息量的捕捉

R.png

1-我們的模型沒(méi)有捕捉到的信息量占真實(shí)標(biāo)簽中所帶的信息量的比例

  • 分母是不變的,則誤差越小則分子分母表達(dá)式返回的結(jié)果越小,則r2越接近1.

  • 可以使用三種方式來(lái)調(diào)用

    • 一種是直接從metrics中導(dǎo)入r2_score,輸入預(yù)測(cè)值和真實(shí)值后打分。
    • 第二種是直接從 線性回歸LinearRegression的接口score來(lái)進(jìn)行調(diào)用。
    • 第三種是在交叉驗(yàn)證中,輸入"r2"來(lái)調(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()
擬合圖.png

可見(jiàn),雖然我們的大部分?jǐn)?shù)據(jù)被擬合得比較好,但是圖像的開(kāi)頭和結(jié)尾處卻又著較大的擬合誤差。如果我們?cè)趫D像右側(cè)分布著更多的數(shù)據(jù),我們的模型就會(huì)越來(lái)越偏離我們真正的標(biāo)簽。這種結(jié)果類似于我們前面提到的,雖然在有限的數(shù)據(jù)集上將數(shù)值預(yù)測(cè)正確了,但卻沒(méi)有正確擬合數(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ù)集來(lái)自臺(tái)灣新北市新店區(qū)。“房地產(chǎn)估價(jià)” 是一個(gè)回歸問(wèn)題。
    • 屬性信息:
      • 輸入如下:
        • 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米平方)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。