多元统计分析——多元线性回归
生活随笔
收集整理的這篇文章主要介紹了
多元统计分析——多元线性回归
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 經(jīng)典的線性回歸分析與交叉驗(yàn)證
examDict={' 學(xué)習(xí)時(shí) ':[0.50, 0.75, 1.00, 1.25,1.50,1.75, 1.75,2.00, 2.25,2.50,
2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], '分':[10,22,13 ,43,20,22,33,50,62 ,
48,55,75,62,73,81,76,64,82,90,93]}
examDf = pd.DataFrame(examDict)
X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=0.8)
model = LinearRegression()
model.fit(X_train,Y_train)
a = model.intercept_#截距
b = model.coef_#回歸系數(shù)
y_train_pred = model.predict(X_train) #預(yù)測(cè)
score = model.score(X_test,Y_test) #可決系數(shù) 0.8866470295386657 2. 經(jīng)典的多元線性回歸分析的模型參數(shù)的假設(shè)檢驗(yàn) import statsmodels.api as sm
from sklearn import datasets ## 從 scikit-learn 導(dǎo)入數(shù)據(jù)集
data = datasets.load_boston() ## 從數(shù)據(jù)集庫加載波士頓數(shù)據(jù)集
import numpy as np
import pandas as pd
df = pd.DataFrame(data.data, columns=data.feature_names)
target = pd.DataFrame(data.target, columns=["MEDV"])
X = df[['CRIM', 'ZN', 'INDUS']] ## X 通常表示我們的輸入變量 (或自變量)
y = target["MEDV"] ## Y 通常表示輸出/因變量
X = sm.add_constant(X) ## 我們添加一個(gè)截距(beta_0)到我們的模型
model = sm.OLS(y, X).fit() ## sm.OLS(輸出, 輸入)
predictions = model.predict(X)
model.summary() ## 打印出統(tǒng)計(jì)模型
3. 嶺回歸模型
X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8) model = Ridge(alpha=0.5,fit_intercept=True) model = RidgeCV(alphas=[0.01,0.1,0.2, 0.5, 1],normalize = True,cv=10) model.fit(X_train,Y_train) ridge_best_alpha = model.alpha_ #得到最佳lambda值 print(f"嶺回歸關(guān)鍵正則參數(shù)={ridge_best_alpha}") 計(jì)算可決系數(shù) a=model.intercept_ b=model.coef_ y_train_pred =model.predict(X_train) score=model.score(X_test, Y_test) print(score)4. 基于最佳lambda值建模
ridge = Ridge(alpha = ridge_best_alpha,normalize = True) ridge.fit(X_train,Y_train) ridge_predict = ridge.predict(X_test) 計(jì)算損失函數(shù) rmse = np.sqrt(mean_squared_error(Y_test,ridge_predict))5. ?LASSO回歸模型:
lasso_cv = LassoCV(alphas = alphas, normalize=True, cv = 10, max_iter=10000) lasso_cv.fit(x_tr,y_tr) lasso_best_alpha = lasso_cv.alpha_ lasso_best_alpha lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000) lasso.fit(x_tr, y_tr) lasso_predict = lasso.predict(x_te) #預(yù)測(cè) RMSE = np.sqrt(mean_squared_error(y_te,lasso_predict))本次任務(wù)額外知識(shí)點(diǎn):
seed = 7
np.random.seed(seed)
10折交叉驗(yàn)證
kfold = StratifiedKFold(n_splits=10, shuffle=False, random_state=seed)
固定random_state后,每次構(gòu)建的模型是相同的、生成的數(shù)據(jù)集是相同的、每次的拆分結(jié)果也是相同的
y代表輸出答案,y_代表標(biāo)準(zhǔn)答案
mse=tf.reduce_mean(tf.square(Y_test-yy_train_pred))
題目
3. 數(shù)據(jù)集簡(jiǎn)介 原始數(shù)據(jù)有 14 個(gè)變量的 506 個(gè)觀察值,其中,medv(自住房屋房 價(jià)中位數(shù),單位:千美元)是原始的目標(biāo)變量,其他變量包括:crim(城鎮(zhèn) 的人均犯罪率)、mn(占地面積超過 25000 平方英尺的住宅用地的比例)、indus(每個(gè)鎮(zhèn)的非零售業(yè)務(wù)比例,單位:英畝)、chas(有關(guān)查爾斯河的 虛擬變量,如果挨著河為1,否則為0)、mo(一氧化氮濃度,單位:Ppm)、 m(平均每間住房的房間數(shù)量)、age(1940 年以前建成的自住單位的房 齡比例)、dis(五個(gè)波土頓就業(yè)中心的加權(quán)距離)、rad(高速公路的可達(dá) 性指數(shù))、tax(每萬美元全價(jià)物業(yè)值的財(cái)產(chǎn)稅率)、ptratio(城鎮(zhèn)學(xué)生與教 師的比例)、b(=100078-0.63)2,其中的 B 是城鎮(zhèn)黑人的比例)、Istat(低 收入人口比例);更正過的數(shù)據(jù)集有以下附加變量:cmed(修正了的自住 房?jī)r(jià)中位數(shù),單位:千美元)、tow(鎮(zhèn)名稱)、trat(人口普查區(qū))、lon(人 口普查區(qū)的經(jīng)度)、lat(人口普查區(qū)的緯度)。 4. 數(shù)據(jù)集使用 我們將用 comedy(修正了的自住房屋房?jī)r(jià)中位數(shù))作為因變量, 而將 crim,zn,indus,nox,rm,age,dis,rad,tax,ptratio,b, lstat 這12個(gè)變量作為自變量。(數(shù)據(jù)詳見BostonHousing2.csv文件)。 5. 回歸任務(wù)指定 (1)利用指定的 12 個(gè)自變量與因變量 comedy 創(chuàng)建散布圖矩陣,主要目的查看各自變量與因變量之間的相關(guān)性。 (2)隨機(jī)地將當(dāng)前數(shù)據(jù)集按照 3:1 的容量比例劃分為訓(xùn)練集(用于建立模型)和測(cè)試集(用于檢測(cè)模型的預(yù)測(cè)精度),重復(fù)此步驟十次, 并將得到十次結(jié)果制作如下的折線圖,其中橫坐標(biāo)為次數(shù),縱坐標(biāo)為 對(duì)應(yīng)次數(shù)的可決系數(shù)。如下圖所示(可以與圖不一致,主要體現(xiàn)可決系數(shù)變化規(guī)律) (3)最優(yōu)回歸方程的選擇:從 12 個(gè)自變量中隨機(jī)的抽取 n(其中 n=2,…..12)個(gè)自變量,并利用十折交叉驗(yàn)證計(jì)算所建模型的可決系 數(shù),依據(jù)以上 12 個(gè)模型的可決系數(shù)大小確定哪一個(gè)模型的預(yù)測(cè)精度 較高。(并不一定使用全部自變量的模型精度最好) (4)嶺回歸、Lasso 回歸模型中關(guān)鍵正則參數(shù)𝛌的選擇:在給定參數(shù)𝛌 的 0.01,0.1,0.2, 0.5, 1 這五個(gè)可能性取值的條件下,利用十折交 叉驗(yàn)證和可決系數(shù)確定兩個(gè)模型的各自最優(yōu)參數(shù)𝛌。 (5)在最優(yōu)參數(shù)𝛌的條件下的 Lasso 回歸模型、嶺回歸及使用全部 12 個(gè)自變量模型的可決系數(shù)(十折交叉驗(yàn)證得到的)的對(duì)比,在此數(shù)據(jù) 集上哪一個(gè)模型的精度最高呢?在取定最優(yōu)參數(shù)𝛌的條件下 Lasso 回歸模型中,計(jì)算回歸系數(shù)為零的個(gè)數(shù)與全部自變量個(gè)數(shù)(即,12)的比例。 全部代碼 import numpy as np import random # import matplotlib.pyplot as plt import matplotlib import pandas as pd from pandas.plotting import scatter_matrix from sklearn.linear_model import Ridge,RidgeCV from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from matplotlib import pyplot as plt #as就是重新命名的意思 from matplotlib.font_manager import FontProperties #導(dǎo)入中文字體 from sklearn.linear_model import Lasso,LassoCV from sklearn.metrics import mean_squared_error import numpy as np from sklearn.model_selection import StratifiedKFold#font = FontProperties(fname=r"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc") matplotlib.rcParams['font.family']='SimHei' matplotlib.rcParams['font.sans-serif']=['SimHei']pd_data=pd.read_csv(r"./BostonHousing2.csv",header=1) #print(pd_data)df1=pd_data[['cmedv']] df2=pd_data[['crim', 'zn', 'indus','nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b','lstat']]# #任務(wù)一: print("***************************************************************") print("任務(wù)一")dff=pd_data[['crim', 'zn', 'indus','nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b','lstat','cmedv']] plt.figure() #自變量 scatter_matrix(dff, alpha = 0.3, figsize = (14,8)); plt.grid(True) plt.savefig('cmedy') plt.show()##任務(wù)二: print("***************************************************************") print("任務(wù)二")li=[] for epoch in range(10):X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8) model = Ridge(alpha=0.5,fit_intercept=True)model = RidgeCV(alphas=[0.1, 1.0, 10.0]) # 通過 RidgeCV 使用交叉驗(yàn)證獲取最佳參數(shù)值 model.fit(X_train,Y_train) a=model.intercept_b=model.coef_y_train_pred =model.predict(X_train)score=model.score(X_test, Y_test)li.append(score) x = list(range(1, 11, 1)) y = [round(i,2) for i in li]plt.plot(x, y, linewidth=2, color='g', marker='o',markerfacecolor='blue', markersize=3)#繪制圖片 plt.plot(x,y) plt.ylim(0, 1) # 限定縱軸的范圍for a, b in zip(x, y):plt.text(a, b, b, ha='center', va='bottom', fontsize=20) plt.title("房?jī)r(jià)預(yù)測(cè)") plt.xlabel("訓(xùn)練輪數(shù)") plt.ylabel("可決系數(shù)") plt.show()#任務(wù)三 (包含任務(wù)5)#利用嶺回歸模型隨機(jī)選取變量進(jìn)行十折交叉,計(jì)算可決系數(shù) print("任務(wù)三 (包含任務(wù)5)") print("下面對(duì)變量進(jìn)行隨機(jī)抽取:") X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8) for p in range(10):ans=random.randint(1, 12)df3 = X_train.sample(n=ans,axis=1)l=list(df3.columns)df4=pd.DataFrame(X_test,columns=l)model = Ridge(alpha=0.5,fit_intercept=True)model = RidgeCV(alphas=[0.01,0.1,0.2, 0.5, 1],normalize = True,cv=10)model.fit(df3,Y_train)ridge_best_alpha = model.alpha_ #得到最佳lambda值a=model.intercept_b=model.coef_yy_train_pred =model.predict(df3)score = model.score(df4,Y_test)print(f"第{p+1}輪,隨機(jī)抽取{ans}個(gè)變量\n嶺回歸關(guān)鍵正則參數(shù)={ridge_best_alpha},可決系數(shù){round(score,2)}")#任務(wù)四 (包含任務(wù)5) print("*************************************************") print("任務(wù)四 (包含任務(wù)5)") print(f"嶺回歸回歸模型中關(guān)鍵正則參數(shù)𝛌的選擇:") X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8) model = Ridge(alpha=0.5,fit_intercept=True) model = RidgeCV(alphas=[0.01,0.1,0.2, 0.5, 1],normalize = True,cv=10) model.fit(X_train,Y_train) ridge_best_alpha = model.alpha_ #得到最佳lambda值 print(f"嶺回歸關(guān)鍵正則參數(shù)𝛌={ridge_best_alpha}")ridge = Ridge(alpha = ridge_best_alpha,normalize = True) ridge.fit(X_train,Y_train) ridge_predict = ridge.predict(X_test) mse = np.sqrt(mean_squared_error(Y_test,ridge_predict)) score=model.score(X_test, Y_test) print(f"在最優(yōu)參數(shù)𝛌的條件下,損失值{round(mse,2)},可決系數(shù):{round(score,2)}")print("*************************************************") print(f"LASSO回歸模型中關(guān)鍵正則參數(shù)𝛌的選擇:") X_train,X_test,Y_train,Y_test = train_test_split(df2,df1,train_size=0.8) lasso_cv = LassoCV(alphas = [0.01,0.1,0.2, 0.5, 1], normalize=True, cv = 10) lasso_cv.fit(X_train,pd.DataFrame(Y_train).values.ravel()) #本來需要一維向量,但是輸入為列向量,所以找到出錯(cuò)的位置,應(yīng)用ravel()函數(shù)即可。 lasso_best_alpha = lasso_cv.alpha_ # 取出最佳的lambda值 print(f"LASSO回歸關(guān)鍵正則參數(shù)𝛌={lasso_best_alpha}") lasso = Lasso(alpha = lasso_best_alpha, normalize=True) lasso.fit(X_train,pd.DataFrame(Y_train).values.ravel()) lasso_predict = lasso.predict(X_test) #預(yù)測(cè) MSE = np.sqrt(mean_squared_error(Y_test,lasso_predict)) ss=model.score(X_test, Y_test) print(f"在最優(yōu)參數(shù)𝛌的條件下,損失值{round(MSE,2)},可決系數(shù):{round(ss,2)}")print("***************************************************************") print("任務(wù)五")ll=lasso.coef_ print("各變量回歸系數(shù)如下:") print(ll) ans=0 for i in ll:if abs(i)<=0.05:ans+=1 tmp=round(ans/12,2) tmp=int(tmp*100) print(f"回歸系數(shù)為零的個(gè)數(shù)與全部自變量個(gè)數(shù)比例:{tmp}%.")總結(jié)
以上是生活随笔為你收集整理的多元统计分析——多元线性回归的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微粒群算法
- 下一篇: SQL Server 2019 安装教程