Python數據科學:線性回歸
02 多元線性回歸
多元線性回歸是在簡單線性回歸的基礎上,增加更多的自變量。
二元線性回歸是最簡單的多元線性回歸。
其中一元回歸擬合的是一條回歸線,那么二元回歸擬合的便是一個回歸平面。
在多元線性回歸中,要求自變量與因變量之間要有線性關系,且自變量之間的相關系數要盡可能的低。
回歸方程中與因變量線性相關的自變量越多,回歸的解釋力度就越強。
若方程中非線性相關的自變量越多,那么模型解釋力度就越弱。
可以使用調整后的R?(與觀測個數及模型自變量個數有關)來評價回歸的優劣程度,即評價模型的解釋力度。
下面還是以書中的案例,實現一個多元線性回歸。
分析客戶年齡、年收入、小區房屋均價、當地人均收入與信用卡月均支出的關系。
# 使用多元線性回歸建立模型
lm_m = ols('avg_exp ~ Age + Income + dist_home_val + dist_avg_income', data=exp).fit()
print(lm_m.summary())
多元線性回歸模型信息如下。

輸出R為0.542,調整R?為0.513。
方程顯著性(回歸系數不全為0)的檢驗P值為1.82e-10,接近于0,說明回歸方程是有意義的。
客戶年齡、小區房屋均價的回歸系數都不顯著。
年收入、當地人均收入的回歸系數顯著。
多元線性回歸可以根據向前法、向后法、逐步法來對自變量進行篩選。
向前法就是不斷加入變量去構建回歸方程,向后法則是不斷去除變量去構建回歸方程,逐步法是兩者的結合,又加入又刪除的。
三種方法都是基于AIC準則(最小信息準則),其中AIC值越小說明模型效果越好,越簡潔。
使用AIC準則能夠避免變量的增加成為殘差平方和減小的主要原因情況的發生,防止模型復雜度的增加。
本次采用向前回歸法,不斷加入變量,得到加入后變量的AIC值,最后找到解釋力度最大的變量。
# 向前回歸法
def forward_select(data, response):
"""data是包含自變量及因變量的數據,response是因變量"""
# 獲取自變量列表
remaining = set(data.columns)
remaining.remove(response)
selected = []
# 定義數據類型(正無窮)
current_score, best_new_score = float('inf'), float('inf')
# 自變量列表含有自變量時
while remaining:
aic_with_candidates = []
# 對自變量列表進行循環
for candidates in remaining:
# 構建表達式,自變量會不斷增加
formula = "{} ~ {}".format(response, ' + '.join(selected + [candidates]))
# 生成自變量的AIC解釋力度
aic = ols(formula=formula, data=data).fit().aic
# 得到自變量的AIC解釋力度列表
aic_with_candidates.append((aic, candidates))
# 對解釋力度列表從大到小排序
aic_with_candidates.sort(reverse=True)
# 得到解釋力度最大值(AIC值最小)及自變量
best_new_score, best_candidate = aic_with_candidates.pop()
# 1.正無窮大大于解釋力度最大值 2.上一期實驗的AIC值需大于下一期的AIC實驗值,即添加變量越多,AIC值應該越小,模型效果越好
if current_score > best_new_score:
# 移除影響最大的自變量
remaining.remove(best_candidate)
# 添加影響較大的自變量
selected.append(best_candidate)
# 賦值本次實驗的AIC值
current_score = best_new_score
print('aic is {},continue!'.format(current_score))
else:
print('forward selection over!')
break
# 采用影響較大的自變量列表,對數據做線性回歸
formula = "{} ~ {}".format(response, ' + '.join(selected))
print('final formula is {}'.format(formula))
model = ols(formula=formula, data=data).fit()
return model
# 采用向前回歸法篩選變量,利用篩選的變量構建回歸模型
data_for_select = exp[['avg_exp', 'Income', 'Age', 'dist_home_val', 'dist_avg_income']]
lm_m = forward_select(data=data_for_select, response='avg_exp')
print(lm_m.rsquared)
輸出結果。

發現客戶年齡(Age)被篩除了,最終得到線性回歸模型。
/ 03 / 總結
這里只是構建了一下線性回歸模型而已,只能說湊合著用。
后面還將對模型進行診斷,使得模型更具有參考價值。
未完待續...
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













