線性回歸到對數(shù)幾率回歸

一、回歸(Regression)

回歸分析是一種預(yù)測性的建模技術(shù),它研究的是因變量(目標(biāo))和自變量(預(yù)測器)之間的關(guān)系。這種技術(shù)通常用于預(yù)測分析,時間序列模型以及發(fā)現(xiàn)變量之間的因果關(guān)系。

比如說,在當(dāng)前的經(jīng)濟(jì)條件下,你要估計(jì)一家公司的銷售額增長情況?,F(xiàn)在,你有公司最新的數(shù)據(jù),這些數(shù)據(jù)顯示出銷售額增長大約是經(jīng)濟(jì)增長的2.5倍。那么使用回歸分析,我們就可以根據(jù)當(dāng)前和過去的信息來預(yù)測未來公司的銷售情況。

一般來說有線性回歸、邏輯回歸、多項(xiàng)式回歸、逐步回歸、嶺回歸、套索回歸、ElasticNet回歸等七種最常用的回歸技術(shù)。

用數(shù)學(xué)公式一般的來表達(dá):

二、簡介線性回歸

起源

“回歸”是由英國著名生物學(xué)家兼統(tǒng)計(jì)學(xué)家高爾頓(Francis Galton,1822~1911. 生物學(xué)家達(dá)爾文的表弟)在研究人類遺傳問題時提出來的。為了研究父代與子代身高的關(guān)系,高爾頓搜集了1078對父親及其兒子的身高數(shù)據(jù)。他發(fā)現(xiàn)這些數(shù)據(jù)的散點(diǎn)圖大致呈直線狀態(tài),也就是說,總的趨勢是父親的身高增加時,兒子的身高也傾向于增加。但是,高爾頓對試驗(yàn)數(shù)據(jù)進(jìn)行了深入的分析,發(fā)現(xiàn)了一個很有趣的現(xiàn)象—回歸效應(yīng)。因?yàn)楫?dāng)父親高于平均身高時,他們的兒子身高比他更高的概率要小于比他更矮的概率;父親矮于平均身高時,他們的兒子身高比他更矮的概率要小于比他更高的概率。它反映了一個規(guī)律,即這兩種身高父親的兒子的身高,有向他們父輩的平均身高回歸的趨勢。對于這個一般結(jié)論的解釋是:大自然具有一種約束力,使人類身高的分布相對穩(wěn)定而不產(chǎn)生兩極分化,這就是所謂的回歸效應(yīng)。

1855年, 高爾頓發(fā)表《遺傳的身高向平均數(shù)方向的回歸》一文,他和他的學(xué)生卡爾?皮爾遜Karl·Pearson通過觀察1078對夫婦的身高數(shù)據(jù),以每對夫婦的平均身高作為自變量,取他們的一個成年兒子的身高作為因變量,分析兒子身高與父母身高之間的關(guān)系,發(fā)現(xiàn)父母的身高可以預(yù)測子女的身高,兩者近乎一條直線。當(dāng)父母越高或越矮時,子女的身高會比一般兒童高或矮,他將兒子與父母身高的這種現(xiàn)象擬合出一種線形關(guān)系,分析出兒子的身高y與父親的身高x大致可歸結(jié)為一下關(guān)系:
y=33.73+0.516*x (單位為英寸)
根據(jù)換算公式1英寸=0.0254米, 1米=39.37英寸。單位換算成米后:
Y= 0.8567+0.516*X (單位為米)
假如父母輩的平均身高為1.75米,則預(yù)測子女的身高為1.7597米。這種趨勢及回歸方程表明父母身高每增加一個單位時,其成年兒子的身高平均增加0.516個單位。這就是回歸一詞最初在遺傳學(xué)上的含義。

有趣的是,通過觀察,高爾頓還注意到,盡管這是一種擬合較好的線形關(guān)系,但仍然存在例外現(xiàn)象:矮個父母所生的兒子比其父要高,身材較高的父母所生子女的身高卻回降到多數(shù)人的平均身高。換句話說,當(dāng)父母身高走向極端,子女的身高不會象父母身高那樣極端化,其身高要比父母們的身高更接近平均身高,即有“回歸”到平均數(shù)去的趨勢,這就是統(tǒng)計(jì)學(xué)上最初出現(xiàn)“回歸”時的涵義,高爾頓把這一現(xiàn)象叫做“向平均數(shù)方向的回歸” (regression toward mediocrity),或者翻譯為“向平均數(shù)的衰退”。雖然這是一種特殊情況,與線形關(guān)系擬合的一般規(guī)則無關(guān),但“線形回歸”的術(shù)語卻因此沿用下來,作為根據(jù)一種變量(父母身高)預(yù)測另一種變量(子女身高)或多種變量關(guān)系的描述方法。

線性回歸

線性回歸(Linear regression)是一種以線性模型來建模自變量與因變量關(guān)系的方法。通常來說,當(dāng)自變量只有一個的情況被稱為簡單線性回歸(或者一元線性回歸),自變量大于一個的情況被稱為多重線性回歸(或者多元線性回歸)。

在線性回歸模型中, 模型的未知參數(shù)由數(shù)據(jù)中估計(jì)得到。最常用的擬合方法是最小二乘法,但是也有許多其他的擬合方法。因此需要甄別的是,使用最小二乘法求解并不是構(gòu)成線性回歸模型的必要條件。

應(yīng)用范圍

線性回歸是應(yīng)用最廣泛的回歸分析之一,主要可以用于以下兩類:

  • 預(yù)測:線性回歸可以在擬合到已知數(shù)據(jù)集后用于預(yù)測自變量所對應(yīng)的因變量
  • 解釋:線性回歸可以用于量化因變量與自變量之間關(guān)系的強(qiáng)度

三、線性回歸的理論簡介

一元線性回歸

在線性回歸中,最小二乘法就是試圖找到一條直線,使所有樣本到直線上的歐式距離之和最小?,F(xiàn)在我們假設(shè)數(shù)據(jù)樣本為:(x1,y1), (x2,y2), (x3,y3), ... (xn,yn),設(shè)一元線性回歸方程為:

這里我們想要最后擬合的結(jié)果函數(shù)能盡可能的使得每個樣本點(diǎn)都落在一元線性回歸方程上,因?yàn)閷?shí)際上,基本不存在這樣一條直線(超平面)能滿足所有點(diǎn)都在回歸方程上。于是擬合的過程就會有誤差,回歸直線應(yīng)滿足的條件是:全部觀測值與對應(yīng)的回歸估計(jì)值的誤差(或者是距離)最小。

在最小二乘法中,誤差使用歐式距離(均方誤差MSE)來表示,即:

然后可知,這里的求最小值,就變成了二元函數(shù)求極小值,分別對兩個變量求導(dǎo),即:

令分別求導(dǎo)的結(jié)果為0,得:


其中 為自變量x的數(shù)據(jù)樣本平均值。

一元的線性回歸便于理解,方便作圖,使后面的多元線性回歸和對數(shù)幾率回歸更好理解。最小二乘法的過程就像下圖:


圖左邊的紅點(diǎn)就相當(dāng)于是在對公式中的 wb 求導(dǎo),現(xiàn)象就是紅點(diǎn)在兩個維度上不停的下降,直到得到兩個參數(shù)求導(dǎo)后的最優(yōu)閉式(closed-form)解。右邊擬合的結(jié)果函數(shù)隨著求導(dǎo)的過程,不斷擬合逼近數(shù)據(jù)的回歸,最后就可以用函數(shù)來預(yù)測和分析數(shù)據(jù)。這里說明,我理解的回歸應(yīng)該是數(shù)據(jù)的本質(zhì),而擬合只是達(dá)到了數(shù)據(jù)的表象。

多元線性回歸

一元線性回歸便于理解,也很簡單的使用,但是現(xiàn)實(shí)中,即使再怎么控制變量,實(shí)際影響結(jié)果的變量總是會是多個,那么多元線性回歸就出現(xiàn)了。數(shù)學(xué)公式上,原來的w和b變成了矩陣wb,原來的公式:


化為矩陣的形式:

其中:


多元線性回歸的損失函數(shù)和最小二乘法的使用推導(dǎo)見《機(jī)器學(xué)習(xí)》。

對數(shù)線性回歸與廣義線性模型

不管一元線性回歸還是多元線性回歸,始終都是在線性的尺度上擬合,而現(xiàn)實(shí)中有更多的問題是在非線性尺度上的擬合。于是我們把上述的公式改寫,得到一個對數(shù)線性回歸(log-linear regression):

他的意思是:


在不斷的逼近于y。這樣就做到了輸入空間到輸出空間的非線性映射。

然后更一般的我們推導(dǎo)出廣義線性模型:


其中,函數(shù) g(·) 稱為“聯(lián)系函數(shù)”,其單調(diào)可微。

很顯然,對數(shù)線性回歸是廣義線性模型在 g(·)=ln(·) 時的特例。

可以看出聯(lián)系函數(shù)是線性的函數(shù)還是非線性的函數(shù)就決定著廣義線性模型的線性與非線性。

對數(shù)幾率回歸

對數(shù)幾率回歸(Logistic Regression )又稱為邏輯回歸,完全是因?yàn)橐糇g的翻譯錯誤,根本與中文的邏輯沒有半毛錢關(guān)系。Logistic Regression 雖然被稱為回歸,但其實(shí)際上是分類模型,并常用于二分類。Logistic Regression 因其簡單、可并行化、可解釋強(qiáng)深受工業(yè)界喜愛。

Logistic 回歸的本質(zhì)是:假設(shè)數(shù)據(jù)服從這個分布,然后使用極大似然估計(jì)做參數(shù)的估計(jì)。

許多的時候認(rèn)為SVM(支持向量機(jī))與對數(shù)幾率回歸傻傻分不清,因?yàn)樗麄兌荚趪L試對已有的分布數(shù)據(jù)找到一個可以切割開數(shù)據(jù)的超平面,只是使用的方法不同,關(guān)注的方面不一樣。然后自然SVM和LR隊(duì)數(shù)據(jù)分類的結(jié)果也會有一些差異,下面我們看對數(shù)幾率回歸。

  • sigmoid 函數(shù)

LR來做分類,有一個好處是,可以明確的計(jì)算出分類的概率。我們知道,概率是屬于[0,1]區(qū)間。但是像:

這樣形式的函數(shù)值域是負(fù)無窮到正無窮。我們不能直接基于線性模型建模,需要找到一個模型的值域剛好在[0,1]區(qū)間,同時要足夠好用。在接近區(qū)分域的時候,函數(shù)變化很快能有很強(qiáng)的區(qū)分,并且函數(shù)是連續(xù)可微的。恰好 sigmoid 函數(shù)就是這樣的一個函數(shù),如下:

函數(shù)圖像為:


  • 對數(shù)幾率函數(shù)
    我們結(jié)合sigmoid函數(shù),線性回歸函數(shù),把線性回歸模型的輸出作為sigmoid函數(shù)的輸入。于是最后就變成了邏輯回歸模型。

    對數(shù)幾率函數(shù):

    于是有:

我們將 y 視為 x 為正例的概率,則 1-y 為 x 為其反例的概率。兩者的比值稱為幾率(odds),指該事件發(fā)生與不發(fā)生的概率比值,若事件發(fā)生的概率為 p。則對數(shù)幾率:

將 y 視為類后驗(yàn)概率估計(jì),重寫公式有:

也就是說,輸出 Y=1 的對數(shù)幾率是由輸入 x 的線性函數(shù)表示的模型,這就是對數(shù)幾率回歸模型。

通過上述推導(dǎo)我們可以看到 Logistic 回歸實(shí)際上是使用線性回歸模型的預(yù)測值逼近分類任務(wù)真實(shí)標(biāo)記的對數(shù)幾率,其優(yōu)點(diǎn)有:

  • 直接對分類的概率建模,無需實(shí)現(xiàn)假設(shè)數(shù)據(jù)分布,從而避免了假設(shè)分布不準(zhǔn)確帶來的問題;
  • 不僅可預(yù)測出類別,還能得到該預(yù)測的概率,這對一些利用概率輔助決策的任務(wù)很有用;
  • 對數(shù)幾率函數(shù)是任意階可導(dǎo)的凸函數(shù),有許多數(shù)值優(yōu)化算法都可以求出最優(yōu)解。
求解參數(shù)

如線性回歸中使用最小二乘法來求解參數(shù)。在邏輯回歸模型的數(shù)學(xué)形式確定后,統(tǒng)計(jì)學(xué)中,常常使用極大似然估計(jì)法來求解,即找到一組參數(shù),使得在這組參數(shù)下,我們的數(shù)據(jù)的似然度(概率)最大。

似然函數(shù):

求解過程可以使用隨機(jī)梯度下降和牛頓法。除此之外再機(jī)器學(xué)習(xí)中,為了降低過擬合,需要加入一些正則項(xiàng)。推導(dǎo)見《機(jī)器學(xué)習(xí)》。

與線性回歸的區(qū)別
  • 邏輯回歸解決的是分類問題,輸出的是離散值,線性回歸解決的是回歸問題,輸出的連續(xù)值
  • 線性回歸是在實(shí)數(shù)域范圍內(nèi)進(jìn)行預(yù)測,而分類范圍則需要在 [0,1],邏輯回歸減少了預(yù)測范圍
  • 線性回歸在實(shí)數(shù)域上敏感度一致,而邏輯回歸在 0 附近敏感,在遠(yuǎn)離 0 點(diǎn)位置不敏感,這個的好處就是模型更加關(guān)注分類邊界,可以增加模型的魯棒性

四、Linear Regression and Logistic Regression

一元線性回歸

使用教材上的數(shù)據(jù):

matlab來擬合代碼如下:

x = [10, 20, 30, 40, 50, 60, 70, 80];
y = [0.18, 0.50, 0.61, 0.77, 1.05, 1.10, 1.36, 1.58];

x = x';
y = y';

plot(x, y, '*');
xlabel('總量');
ylabel('吸附量');
title('Linear Regression')
hold on

[B, BINT, R, RINT, STATS] = regress(y, x);

disp(B)     % 回歸系數(shù)向量
disp(BINT)  % 回歸系數(shù)的估計(jì)區(qū)間
disp(R)     % 殘差,就是最小二乘法計(jì)算后的結(jié)果,也是誤差,歐式距離
disp(RINT)  % 置信區(qū)間
disp(STATS) % 檢驗(yàn)回歸模型的統(tǒng)計(jì)量。有4個數(shù)值:判定系數(shù)r2,F(xiàn)統(tǒng)計(jì)量觀測值,檢驗(yàn)的p的值,誤差方差的估計(jì)

yf = B(1) * x;
plot(x, yf);

legend('原始數(shù)據(jù)', '1階擬合');

hold off

上面的代碼運(yùn)行的繪圖結(jié)果為:

輸出為:

   0.0197

    0.0187    0.0206

   -0.0166
    0.1069
    0.0203
   -0.0163
    0.0672
   -0.0794
   -0.0160
    0.0075

   -0.1684    0.1353
   -0.0008    0.2145
   -0.1280    0.1686
   -0.1624    0.1298
   -0.0596    0.1939
   -0.1935    0.0347
   -0.1485    0.1165
   -0.1192    0.1341

    0.9845       NaN       NaN    0.0034

由圖可知,擬合的函數(shù)基本可以代表所有的數(shù)據(jù)點(diǎn)。在matlab中regress函數(shù)是數(shù)學(xué)分析的函數(shù),線性模型使用fitlm,是機(jī)器學(xué)習(xí)中的模型。兩種方法所有的結(jié)果都可以求出來,按照自己的需求來選擇怎么使用,方便就好。

多元線性回歸

我這里采集了一些成都市天府新區(qū)2970套房產(chǎn)的信息,然后去除掉一些信息不全的房產(chǎn),剩下2617套房產(chǎn),把所有數(shù)據(jù)都量化后,得到一個2617 * 7的房產(chǎn)信息矩陣。
然后就得到了多元線性回歸的數(shù)據(jù),2617 * 7的矩陣到2617 * 1的矩陣的映射。現(xiàn)在要找到他們的映射關(guān)系。
這里我使用經(jīng)典的python機(jī)器學(xué)習(xí)庫scikit-learn,來把多元線性回歸在計(jì)算機(jī)模擬,如下:

import numpy as np
from sklearn.linear_model import LinearRegression
from data import *

X, y = load_linear_regression_data()
reg = LinearRegression().fit(X, y)

score = reg.score(X, y)
coef = reg.coef_
intercept = reg.intercept_

py = reg.predict(np.array([[2010, 9, 92.19, 6, 6, 2, 14993]]))
print("---------")
print(py)

輸出的結(jié)果為:[138.71334569]
就是房價(jià)預(yù)測為138.7萬,我修改的原數(shù)據(jù)為:2005 9 92.19 6 6 2 13993 129,原數(shù)據(jù)中最后一列房價(jià)為129萬,但是預(yù)測時改動了一點(diǎn)數(shù)據(jù),基本上差距不大??梢試L試一些波動更大的數(shù)據(jù)進(jìn)去測試,看看結(jié)果偏離是否大。

對數(shù)幾率回歸

在多元線性回歸里面,我們做的是房價(jià)的預(yù)測,看房價(jià)是不是太偏離預(yù)測的回歸函數(shù)。我們就可以得知房價(jià)是高了些還是低了些,高了則不要,低了就可以考慮入手。
但是房價(jià)略低于回歸函數(shù)的房子可能由很多,我們不太可能一個一個去看,很花時間。我們就可以使用對數(shù)幾率回歸,做一個簡單的分類,分出自己心儀類型的房,然后結(jié)合房價(jià)的回歸函數(shù),篩選出更少的房,再去做人工的查看。
這里我同樣使用成都市二手房的數(shù)據(jù),然后自己做了數(shù)據(jù)標(biāo)注。2617 * 8的矩陣到2617 * 1的矩陣的映射,只不過這里2617 * 1的矩陣值都是0和1,0表示不要,1表示要。負(fù)例合計(jì)1718個,正例為899個。
這里使用比較新的AI算法庫pytorch,來實(shí)現(xiàn)對數(shù)幾率函數(shù)的訓(xùn)練學(xué)習(xí),鑒于數(shù)據(jù)量本身也不多,這里就不切分?jǐn)?shù)據(jù)做驗(yàn)證,想看驗(yàn)證的代碼,請移步他處。數(shù)據(jù)量本身也不大,不實(shí)用GPU計(jì)算,使用CPU計(jì)算就夠了,代碼如下:

import numpy as np
import torch
from data import *
import torch.nn as nn

train_dataset = LRDataSet()
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=100,
                                           shuffle=True)

# Logistic regression model, Loss and optimizer
model = nn.Linear(8, 2)
criterion = nn.CrossEntropyLoss()
# optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)

# Train the model
epochs = 2000
total_step = len(train_loader)
for epoch in range(epochs):
    model.train()
    for i, (sources, labels) in enumerate(train_loader):
        model.train()
        # Forward pass
        outputs = model(sources)
        loss = criterion(outputs, labels)

        # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if ((epoch + 1) % 100 == 0 or epoch == 0) and (i + 1) % 20 == 0:
            # Test the model
            model.eval()
            with torch.no_grad():
                correct = 0
                total = 0
                for sources, labels in train_loader:
                    outputs = model(sources)
                    _, predicted = outputs.max(1)
                    total += labels.size(0)
                    correct += (predicted == labels).sum().item()

                accuracy = 100 * correct / total
                print(
                    'Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'
                    .format(epoch + 1, epochs, i + 1, total_step, loss.item(),
                            accuracy))

# Save the model checkpoint
#torch.save(model.state_dict(), 'model.ckpt')

運(yùn)行結(jié)果如下:

Epoch [1/2000], Step [5/9], Loss: 642.1466, Total: 2617, Correct: 899, Accuracy: 34.35%
Epoch [100/2000], Step [5/9], Loss: 9.7680, Total: 2617, Correct: 1571, Accuracy: 60.03%
Epoch [200/2000], Step [5/9], Loss: 1.7235, Total: 2617, Correct: 1793, Accuracy: 68.51%
Epoch [300/2000], Step [5/9], Loss: 0.9440, Total: 2617, Correct: 1803, Accuracy: 68.90%
Epoch [400/2000], Step [5/9], Loss: 1.2405, Total: 2617, Correct: 1809, Accuracy: 69.12%
Epoch [500/2000], Step [5/9], Loss: 0.9300, Total: 2617, Correct: 1817, Accuracy: 69.43%
Epoch [600/2000], Step [5/9], Loss: 0.8301, Total: 2617, Correct: 1832, Accuracy: 70.00%
Epoch [700/2000], Step [5/9], Loss: 0.7874, Total: 2617, Correct: 1857, Accuracy: 70.96%
Epoch [800/2000], Step [5/9], Loss: 0.6431, Total: 2617, Correct: 1855, Accuracy: 70.88%
Epoch [900/2000], Step [5/9], Loss: 0.6474, Total: 2617, Correct: 1843, Accuracy: 70.42%
Epoch [1000/2000], Step [5/9], Loss: 0.6203, Total: 2617, Correct: 1951, Accuracy: 74.55%
Epoch [1100/2000], Step [5/9], Loss: 0.5937, Total: 2617, Correct: 1986, Accuracy: 75.89%
Epoch [1200/2000], Step [5/9], Loss: 0.4514, Total: 2617, Correct: 2014, Accuracy: 76.96%
Epoch [1300/2000], Step [5/9], Loss: 0.4304, Total: 2617, Correct: 2013, Accuracy: 76.92%
Epoch [1400/2000], Step [5/9], Loss: 0.5772, Total: 2617, Correct: 1990, Accuracy: 76.04%
Epoch [1500/2000], Step [5/9], Loss: 0.4965, Total: 2617, Correct: 2025, Accuracy: 77.38%
Epoch [1600/2000], Step [5/9], Loss: 0.4640, Total: 2617, Correct: 2021, Accuracy: 77.23%
Epoch [1700/2000], Step [5/9], Loss: 0.5060, Total: 2617, Correct: 2037, Accuracy: 77.84%
Epoch [1800/2000], Step [5/9], Loss: 0.4431, Total: 2617, Correct: 2039, Accuracy: 77.91%
Epoch [1900/2000], Step [5/9], Loss: 0.4461, Total: 2617, Correct: 2030, Accuracy: 77.57%
Epoch [2000/2000], Step [5/9], Loss: 0.4659, Total: 2617, Correct: 2039, Accuracy: 77.91%

最后的結(jié)果在訓(xùn)練集上的準(zhǔn)確率為77%,這當(dāng)然是不夠的。需要再通過學(xué)習(xí)率的更新,優(yōu)化器的選擇等方法去優(yōu)化。極端的可能,是數(shù)據(jù)在對數(shù)幾率回歸上無法分離開,但是這種情況幾乎不會遇到。

總結(jié)

我在上面的處理中,總共存在幾個問題,留給大家自己思考和改正:

  1. 沒有把數(shù)據(jù)分為訓(xùn)練和驗(yàn)證集,沒有驗(yàn)證擬合的結(jié)果是不是夠好
  2. 數(shù)據(jù)沒有做歸一化的處理,導(dǎo)致某一些數(shù)值較大的數(shù)據(jù)會極大的影響結(jié)果,需要讀者自己再做歸一化處理
  3. 在使用過程中,房價(jià)有關(guān)的因素顯然不止7個維度,數(shù)據(jù)維度方面需要再擴(kuò)充才可以達(dá)到實(shí)用的地步
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容