多元统计分析——多元线性回归
生活随笔
收集整理的這篇文章主要介紹了
多元统计分析——多元线性回归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 經典的線性回歸分析與交叉驗證
examDict={' 學習時 ':[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_#回歸系數
y_train_pred = model.predict(X_train) #預測
score = model.score(X_test,Y_test) #可決系數 0.8866470295386657 2. 經典的多元線性回歸分析的模型參數的假設檢驗 import statsmodels.api as sm
from sklearn import datasets ## 從 scikit-learn 導入數據集
data = datasets.load_boston() ## 從數據集庫加載波士頓數據集
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) ## 我們添加一個截距(beta_0)到我們的模型
model = sm.OLS(y, X).fit() ## sm.OLS(輸出, 輸入)
predictions = model.predict(X)
model.summary() ## 打印出統計模型
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"嶺回歸關鍵正則參數={ridge_best_alpha}") 計算可決系數 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) 計算損失函數 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) #預測 RMSE = np.sqrt(mean_squared_error(y_te,lasso_predict))本次任務額外知識點:
seed = 7
np.random.seed(seed)
10折交叉驗證
kfold = StratifiedKFold(n_splits=10, shuffle=False, random_state=seed)
固定random_state后,每次構建的模型是相同的、生成的數據集是相同的、每次的拆分結果也是相同的
y代表輸出答案,y_代表標準答案
mse=tf.reduce_mean(tf.square(Y_test-yy_train_pred))
題目
3. 數據集簡介 原始數據有 14 個變量的 506 個觀察值,其中,medv(自住房屋房 價中位數,單位:千美元)是原始的目標變量,其他變量包括:crim(城鎮 的人均犯罪率)、mn(占地面積超過 25000 平方英尺的住宅用地的比例)、indus(每個鎮的非零售業務比例,單位:英畝)、chas(有關查爾斯河的 虛擬變量,如果挨著河為1,否則為0)、mo(一氧化氮濃度,單位:Ppm)、 m(平均每間住房的房間數量)、age(1940 年以前建成的自住單位的房 齡比例)、dis(五個波土頓就業中心的加權距離)、rad(高速公路的可達 性指數)、tax(每萬美元全價物業值的財產稅率)、ptratio(城鎮學生與教 師的比例)、b(=100078-0.63)2,其中的 B 是城鎮黑人的比例)、Istat(低 收入人口比例);更正過的數據集有以下附加變量:cmed(修正了的自住 房價中位數,單位:千美元)、tow(鎮名稱)、trat(人口普查區)、lon(人 口普查區的經度)、lat(人口普查區的緯度)。 4. 數據集使用 我們將用 comedy(修正了的自住房屋房價中位數)作為因變量, 而將 crim,zn,indus,nox,rm,age,dis,rad,tax,ptratio,b, lstat 這12個變量作為自變量。(數據詳見BostonHousing2.csv文件)。 5. 回歸任務指定 (1)利用指定的 12 個自變量與因變量 comedy 創建散布圖矩陣,主要目的查看各自變量與因變量之間的相關性。 (2)隨機地將當前數據集按照 3:1 的容量比例劃分為訓練集(用于建立模型)和測試集(用于檢測模型的預測精度),重復此步驟十次, 并將得到十次結果制作如下的折線圖,其中橫坐標為次數,縱坐標為 對應次數的可決系數。如下圖所示(可以與圖不一致,主要體現可決系數變化規律) (3)最優回歸方程的選擇:從 12 個自變量中隨機的抽取 n(其中 n=2,…..12)個自變量,并利用十折交叉驗證計算所建模型的可決系 數,依據以上 12 個模型的可決系數大小確定哪一個模型的預測精度 較高。(并不一定使用全部自變量的模型精度最好) (4)嶺回歸、Lasso 回歸模型中關鍵正則參數𝛌的選擇:在給定參數𝛌 的 0.01,0.1,0.2, 0.5, 1 這五個可能性取值的條件下,利用十折交 叉驗證和可決系數確定兩個模型的各自最優參數𝛌。 (5)在最優參數𝛌的條件下的 Lasso 回歸模型、嶺回歸及使用全部 12 個自變量模型的可決系數(十折交叉驗證得到的)的對比,在此數據 集上哪一個模型的精度最高呢?在取定最優參數𝛌的條件下 Lasso 回歸模型中,計算回歸系數為零的個數與全部自變量個數(即,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 #導入中文字體 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']]# #任務一: print("***************************************************************") print("任務一")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()##任務二: print("***************************************************************") print("任務二")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 使用交叉驗證獲取最佳參數值 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("房價預測") plt.xlabel("訓練輪數") plt.ylabel("可決系數") plt.show()#任務三 (包含任務5)#利用嶺回歸模型隨機選取變量進行十折交叉,計算可決系數 print("任務三 (包含任務5)") print("下面對變量進行隨機抽取:") 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}輪,隨機抽取{ans}個變量\n嶺回歸關鍵正則參數={ridge_best_alpha},可決系數{round(score,2)}")#任務四 (包含任務5) print("*************************************************") print("任務四 (包含任務5)") print(f"嶺回歸回歸模型中關鍵正則參數𝛌的選擇:") 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"嶺回歸關鍵正則參數𝛌={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"在最優參數𝛌的條件下,損失值{round(mse,2)},可決系數:{round(score,2)}")print("*************************************************") print(f"LASSO回歸模型中關鍵正則參數𝛌的選擇:") 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()) #本來需要一維向量,但是輸入為列向量,所以找到出錯的位置,應用ravel()函數即可。 lasso_best_alpha = lasso_cv.alpha_ # 取出最佳的lambda值 print(f"LASSO回歸關鍵正則參數𝛌={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) #預測 MSE = np.sqrt(mean_squared_error(Y_test,lasso_predict)) ss=model.score(X_test, Y_test) print(f"在最優參數𝛌的條件下,損失值{round(MSE,2)},可決系數:{round(ss,2)}")print("***************************************************************") print("任務五")ll=lasso.coef_ print("各變量回歸系數如下:") 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"回歸系數為零的個數與全部自變量個數比例:{tmp}%.")總結
以上是生活随笔為你收集整理的多元统计分析——多元线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。