一钻蹬、回歸(Regression)
回歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關系凭需。這種技術通常用于預測分析问欠,時間序列模型以及發(fā)現(xiàn)變量之間的因果關系肝匆。
比如說,在當前的經濟條件下顺献,你要估計一家公司的銷售額增長情況∑旃現(xiàn)在,你有公司最新的數(shù)據(jù)注整,這些數(shù)據(jù)顯示出銷售額增長大約是經濟增長的2.5倍能曾。那么使用回歸分析,我們就可以根據(jù)當前和過去的信息來預測未來公司的銷售情況肿轨。
一般來說有線性回歸寿冕、邏輯回歸、多項式回歸椒袍、逐步回歸驼唱、嶺回歸、套索回歸驹暑、ElasticNet回歸等七種最常用的回歸技術玫恳。
用數(shù)學公式一般的來表達:二、簡介線性回歸
起源
“回歸”是由英國著名生物學家兼統(tǒng)計學家高爾頓(Francis Galton,1822~1911. 生物學家達爾文的表弟)在研究人類遺傳問題時提出來的优俘。為了研究父代與子代身高的關系京办,高爾頓搜集了1078對父親及其兒子的身高數(shù)據(jù)。他發(fā)現(xiàn)這些數(shù)據(jù)的散點圖大致呈直線狀態(tài)帆焕,也就是說臂港,總的趨勢是父親的身高增加時,兒子的身高也傾向于增加视搏。但是审孽,高爾頓對試驗數(shù)據(jù)進行了深入的分析,發(fā)現(xiàn)了一個很有趣的現(xiàn)象—回歸效應浑娜。因為當父親高于平均身高時佑力,他們的兒子身高比他更高的概率要小于比他更矮的概率;父親矮于平均身高時筋遭,他們的兒子身高比他更矮的概率要小于比他更高的概率打颤。它反映了一個規(guī)律,即這兩種身高父親的兒子的身高漓滔,有向他們父輩的平均身高回歸的趨勢编饺。對于這個一般結論的解釋是:大自然具有一種約束力,使人類身高的分布相對穩(wěn)定而不產生兩極分化响驴,這就是所謂的回歸效應透且。
1855年, 高爾頓發(fā)表《遺傳的身高向平均數(shù)方向的回歸》一文,他和他的學生卡爾?皮爾遜Karl·Pearson通過觀察1078對夫婦的身高數(shù)據(jù)秽誊,以每對夫婦的平均身高作為自變量鲸沮,取他們的一個成年兒子的身高作為因變量,分析兒子身高與父母身高之間的關系锅论,發(fā)現(xiàn)父母的身高可以預測子女的身高讼溺,兩者近乎一條直線。當父母越高或越矮時最易,子女的身高會比一般兒童高或矮怒坯,他將兒子與父母身高的這種現(xiàn)象擬合出一種線形關系,分析出兒子的身高y與父親的身高x大致可歸結為一下關系:
y=33.73+0.516*x (單位為英寸)
根據(jù)換算公式1英寸=0.0254米藻懒, 1米=39.37英寸剔猿。單位換算成米后:
Y= 0.8567+0.516*X (單位為米)
假如父母輩的平均身高為1.75米,則預測子女的身高為1.7597米束析。這種趨勢及回歸方程表明父母身高每增加一個單位時艳馒,其成年兒子的身高平均增加0.516個單位。這就是回歸一詞最初在遺傳學上的含義员寇。
有趣的是弄慰,通過觀察,高爾頓還注意到蝶锋,盡管這是一種擬合較好的線形關系陆爽,但仍然存在例外現(xiàn)象:矮個父母所生的兒子比其父要高,身材較高的父母所生子女的身高卻回降到多數(shù)人的平均身高扳缕。換句話說慌闭,當父母身高走向極端,子女的身高不會象父母身高那樣極端化躯舔,其身高要比父母們的身高更接近平均身高驴剔,即有“回歸”到平均數(shù)去的趨勢,這就是統(tǒng)計學上最初出現(xiàn)“回歸”時的涵義粥庄,高爾頓把這一現(xiàn)象叫做“向平均數(shù)方向的回歸” (regression toward mediocrity)丧失,或者翻譯為“向平均數(shù)的衰退”。雖然這是一種特殊情況惜互,與線形關系擬合的一般規(guī)則無關布讹,但“線形回歸”的術語卻因此沿用下來,作為根據(jù)一種變量(父母身高)預測另一種變量(子女身高)或多種變量關系的描述方法训堆。
線性回歸
線性回歸(Linear regression)是一種以線性模型來建模自變量與因變量關系的方法描验。通常來說,當自變量只有一個的情況被稱為簡單線性回歸(或者一元線性回歸)坑鱼,自變量大于一個的情況被稱為多重線性回歸(或者多元線性回歸)膘流。
在線性回歸模型中, 模型的未知參數(shù)由數(shù)據(jù)中估計得到。最常用的擬合方法是最小二乘法,但是也有許多其他的擬合方法睡扬。因此需要甄別的是盟蚣,使用最小二乘法求解并不是構成線性回歸模型的必要條件黍析。
應用范圍
線性回歸是應用最廣泛的回歸分析之一卖怜,主要可以用于以下兩類:
- 預測:線性回歸可以在擬合到已知數(shù)據(jù)集后用于預測自變量所對應的因變量
- 解釋:線性回歸可以用于量化因變量與自變量之間關系的強度
三、線性回歸的理論簡介
一元線性回歸
在線性回歸中阐枣,最小二乘法就是試圖找到一條直線马靠,使所有樣本到直線上的歐式距離之和最小。現(xiàn)在我們假設數(shù)據(jù)樣本為:(x1,y1), (x2,y2), (x3,y3), ... (xn,yn)蔼两,設一元線性回歸方程為:
這里我們想要最后擬合的結果函數(shù)能盡可能的使得每個樣本點都落在一元線性回歸方程上甩鳄,因為實際上,基本不存在這樣一條直線(超平面)能滿足所有點都在回歸方程上额划。于是擬合的過程就會有誤差妙啃,回歸直線應滿足的條件是:全部觀測值與對應的回歸估計值的誤差(或者是距離)最小。
令分別求導的結果為0阿逃,得:
其中 為自變量x的數(shù)據(jù)樣本平均值铭拧。
一元的線性回歸便于理解,方便作圖恃锉,使后面的多元線性回歸和對數(shù)幾率回歸更好理解搀菩。最小二乘法的過程就像下圖:
圖左邊的紅點就相當于是在對公式中的 w 和 b 求導,現(xiàn)象就是紅點在兩個維度上不停的下降破托,直到得到兩個參數(shù)求導后的最優(yōu)閉式(closed-form)解肪跋。右邊擬合的結果函數(shù)隨著求導的過程,不斷擬合逼近數(shù)據(jù)的回歸炼团,最后就可以用函數(shù)來預測和分析數(shù)據(jù)澎嚣。這里說明,我理解的回歸應該是數(shù)據(jù)的本質瘟芝,而擬合只是達到了數(shù)據(jù)的表象易桃。
多元線性回歸
一元線性回歸便于理解,也很簡單的使用锌俱,但是現(xiàn)實中晤郑,即使再怎么控制變量,實際影響結果的變量總是會是多個,那么多元線性回歸就出現(xiàn)了造寝。數(shù)學公式上磕洪,原來的w和b變成了矩陣w和b,原來的公式:
化為矩陣的形式:
其中:
多元線性回歸的損失函數(shù)和最小二乘法的使用推導見《機器學習》诫龙。
對數(shù)線性回歸與廣義線性模型
不管一元線性回歸還是多元線性回歸析显,始終都是在線性的尺度上擬合,而現(xiàn)實中有更多的問題是在非線性尺度上的擬合签赃。于是我們把上述的公式改寫谷异,得到一個對數(shù)線性回歸(log-linear regression):他的意思是:
在不斷的逼近于y。這樣就做到了輸入空間到輸出空間的非線性映射锦聊。
然后更一般的我們推導出廣義線性模型:
其中歹嘹,函數(shù) g(·) 稱為“聯(lián)系函數(shù)”,其單調可微孔庭。
很顯然尺上,對數(shù)線性回歸是廣義線性模型在 g(·)=ln(·) 時的特例。
可以看出聯(lián)系函數(shù)是線性的函數(shù)還是非線性的函數(shù)就決定著廣義線性模型的線性與非線性圆到。
對數(shù)幾率回歸
對數(shù)幾率回歸(Logistic Regression )又稱為邏輯回歸怎抛,完全是因為音譯的翻譯錯誤,根本與中文的邏輯沒有半毛錢關系构资。Logistic Regression 雖然被稱為回歸抽诉,但其實際上是分類模型,并常用于二分類吐绵。Logistic Regression 因其簡單迹淌、可并行化、可解釋強深受工業(yè)界喜愛己单。
Logistic 回歸的本質是:假設數(shù)據(jù)服從這個分布唉窃,然后使用極大似然估計做參數(shù)的估計。
許多的時候認為SVM(支持向量機)與對數(shù)幾率回歸傻傻分不清纹笼,因為他們都在嘗試對已有的分布數(shù)據(jù)找到一個可以切割開數(shù)據(jù)的超平面纹份,只是使用的方法不同,關注的方面不一樣廷痘。然后自然SVM和LR隊數(shù)據(jù)分類的結果也會有一些差異蔓涧,下面我們看對數(shù)幾率回歸。
- sigmoid 函數(shù)
LR來做分類笋额,有一個好處是元暴,可以明確的計算出分類的概率。我們知道兄猩,概率是屬于[0,1]區(qū)間茉盏。但是像:
函數(shù)圖像為:
-
對數(shù)幾率函數(shù)
對數(shù)幾率函數(shù):
我們結合sigmoid函數(shù)添瓷,線性回歸函數(shù)梅屉,把線性回歸模型的輸出作為sigmoid函數(shù)的輸入值纱。于是最后就變成了邏輯回歸模型鳞贷。
于是有:
也就是說,輸出 Y=1 的對數(shù)幾率是由輸入 x 的線性函數(shù)表示的模型杆故,這就是對數(shù)幾率回歸模型迅箩。
通過上述推導我們可以看到 Logistic 回歸實際上是使用線性回歸模型的預測值逼近分類任務真實標記的對數(shù)幾率,其優(yōu)點有:
- 直接對分類的概率建模处铛,無需實現(xiàn)假設數(shù)據(jù)分布饲趋,從而避免了假設分布不準確帶來的問題;
- 不僅可預測出類別撤蟆,還能得到該預測的概率奕塑,這對一些利用概率輔助決策的任務很有用;
- 對數(shù)幾率函數(shù)是任意階可導的凸函數(shù)家肯,有許多數(shù)值優(yōu)化算法都可以求出最優(yōu)解龄砰。
求解參數(shù)
如線性回歸中使用最小二乘法來求解參數(shù)。在邏輯回歸模型的數(shù)學形式確定后讨衣,統(tǒng)計學中换棚,常常使用極大似然估計法來求解,即找到一組參數(shù)反镇,使得在這組參數(shù)下固蚤,我們的數(shù)據(jù)的似然度(概率)最大。
求解過程可以使用隨機梯度下降和牛頓法愿险。除此之外再機器學習中颇蜡,為了降低過擬合价说,需要加入一些正則項。推導見《機器學習》风秤。
與線性回歸的區(qū)別
- 邏輯回歸解決的是分類問題鳖目,輸出的是離散值,線性回歸解決的是回歸問題缤弦,輸出的連續(xù)值
- 線性回歸是在實數(shù)域范圍內進行預測领迈,而分類范圍則需要在 [0,1],邏輯回歸減少了預測范圍
- 線性回歸在實數(shù)域上敏感度一致碍沐,而邏輯回歸在 0 附近敏感狸捅,在遠離 0 點位置不敏感,這個的好處就是模型更加關注分類邊界累提,可以增加模型的魯棒性
四尘喝、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ù)的估計區(qū)間
disp(R) % 殘差,就是最小二乘法計算后的結果斋陪,也是誤差朽褪,歐式距離
disp(RINT) % 置信區(qū)間
disp(STATS) % 檢驗回歸模型的統(tǒng)計量。有4個數(shù)值:判定系數(shù)r2无虚,F(xiàn)統(tǒng)計量觀測值缔赠,檢驗的p的值,誤差方差的估計
yf = B(1) * x;
plot(x, yf);
legend('原始數(shù)據(jù)', '1階擬合');
hold off
上面的代碼運行的繪圖結果為:輸出為:
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ù)點嗤堰。在matlab中regress
函數(shù)是數(shù)學分析的函數(shù),線性模型使用fitlm
度宦,是機器學習中的模型踢匣。兩種方法所有的結果都可以求出來,按照自己的需求來選擇怎么使用斗埂,方便就好符糊。
多元線性回歸
我這里采集了一些成都市天府新區(qū)2970套房產的信息,然后去除掉一些信息不全的房產呛凶,剩下2617套房產男娄,把所有數(shù)據(jù)都量化后,得到一個2617 * 7
的房產信息矩陣漾稀。
然后就得到了多元線性回歸的數(shù)據(jù)模闲,2617 * 7
的矩陣到2617 * 1
的矩陣的映射”拱裕現(xiàn)在要找到他們的映射關系葫督。
這里我使用經典的python機器學習庫scikit-learn穗泵,來把多元線性回歸在計算機模擬虎谢,如下:
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)
輸出的結果為:[138.71334569]
就是房價預測為138.7萬,我修改的原數(shù)據(jù)為:2005 9 92.19 6 6 2 13993 129
倔监,原數(shù)據(jù)中最后一列房價為129萬戒幔,但是預測時改動了一點數(shù)據(jù)访递,基本上差距不大×梁剑可以嘗試一些波動更大的數(shù)據(jù)進去測試荸实,看看結果偏離是否大。
對數(shù)幾率回歸
在多元線性回歸里面缴淋,我們做的是房價的預測准给,看房價是不是太偏離預測的回歸函數(shù)。我們就可以得知房價是高了些還是低了些重抖,高了則不要露氮,低了就可以考慮入手。
但是房價略低于回歸函數(shù)的房子可能由很多钟沛,我們不太可能一個一個去看畔规,很花時間。我們就可以使用對數(shù)幾率回歸讹剔,做一個簡單的分類油讯,分出自己心儀類型的房,然后結合房價的回歸函數(shù)延欠,篩選出更少的房,再去做人工的查看沈跨。
這里我同樣使用成都市二手房的數(shù)據(jù)由捎,然后自己做了數(shù)據(jù)標注。2617 * 8
的矩陣到2617 * 1
的矩陣的映射饿凛,只不過這里2617 * 1
的矩陣值都是0和1狞玛,0表示不要,1表示要涧窒。負例合計1718個心肪,正例為899個。
這里使用比較新的AI算法庫pytorch纠吴,來實現(xiàn)對數(shù)幾率函數(shù)的訓練學習硬鞍,鑒于數(shù)據(jù)量本身也不多,這里就不切分數(shù)據(jù)做驗證戴已,想看驗證的代碼固该,請移步他處。數(shù)據(jù)量本身也不大糖儡,不實用GPU計算伐坏,使用CPU計算就夠了,代碼如下:
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')
運行結果如下:
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%
最后的結果在訓練集上的準確率為77%握联,這當然是不夠的桦沉。需要再通過學習率的更新每瞒,優(yōu)化器的選擇等方法去優(yōu)化。極端的可能纯露,是數(shù)據(jù)在對數(shù)幾率回歸上無法分離開独泞,但是這種情況幾乎不會遇到。
總結
我在上面的處理中苔埋,總共存在幾個問題懦砂,留給大家自己思考和改正:
- 沒有把數(shù)據(jù)分為訓練和驗證集,沒有驗證擬合的結果是不是夠好
- 數(shù)據(jù)沒有做歸一化的處理组橄,導致某一些數(shù)值較大的數(shù)據(jù)會極大的影響結果荞膘,需要讀者自己再做歸一化處理
- 在使用過程中,房價有關的因素顯然不止7個維度玉工,數(shù)據(jù)維度方面需要再擴充才可以達到實用的地步