模型的假設檢驗
F檢驗:提出原假設和備澤假設 之后計算統計量與理論值 最后比較
F檢驗主要檢驗的模型是否合理
# 導⼊第三⽅模塊
import numpy as np # 計算建模數據中因變量的均值
ybar=train.Profit.mean() # 統計變量個數和觀測個數
p=model2.df_model n=train.shape[0] # 計算回歸離差平⽅和
RSS=np.sum((model2.fittedvalues-ybar)**2) # 計算誤差平⽅和
ESS=np.sum(model2.resid**2) # 計算F統計量的值
F=(RSS/p)/(ESS/(n-p-1)) print('F統計量的值:',F) F統計量的值:174.6372
計算出來的計量值174.64遠遠大於F分布的理論值2.5所以應當拒絕原假設(先假設模型不合理)
# 導⼊模塊
from scipy.stats import f # 計算F分布的理論值
F_Theroy = f.ppf(q=0.95, dfn = p,dfd = n-p-1) print('F分布的理論值為:',F_Theroy) out: F分布的理論值為: 2.5026
T檢驗
T檢驗更加側重於檢驗模型的各個參數是否合理
model.summary() # 絕對值越小影響越大
線性回歸模型的短板
1.自變量的個數大於樣本量
2.自變量之間存在多重共線性
解決線性回歸模型的短板
嶺回歸模型
在線性回歸模型的基礎之上添加一個I2懲罰項(平方項、正則項)
該模型最終變成求解圓柱體與橢圓拋物線的焦點問題
糖尿病案例:
# 導入第三方模塊
import pandas as pd import numpy as np from sklearn import model_selection from sklearn.linear_model import Ridge,RidgeCV import matplotlib.pyplot as plt # 讀取糖尿病數據集
diabetes = pd.read_excel(r'diabetes.xlsx') # 構造自變量(剔除患者性別、年齡和因變量)
predictors = diabetes.columns[2:-1] # 將數據集拆分為訓練集和測試集
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'], test_size = 0.2, random_state = 1234 )
# 構造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200) # 嶺回歸模型的交叉驗證 # 設置交叉驗證的參數,對於每一個Lambda值,都執行10重交叉驗證
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error', cv = 10) # 模型擬合
ridge_cv.fit(X_train, y_train) # 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_ ridge_best_Lambda
# 導入第三方包中的函數
from sklearn.metrics import mean_squared_error # 基於最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True) ridge.fit(X_train, y_train) # 返回嶺回歸系數
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist()) # 預測
ridge_predict = ridge.predict(X_test) # 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict)) RMSE
Lasso回歸模型
在線性回歸模型的基礎之上添加一個I1懲罰項(絕對值項、正則項)
該模型最終轉變成求解正方體與橢圓拋物線的焦點問題
案例:
# 導入第三方模塊中的函數
from sklearn.linear_model import Lasso,LassoCV # LASSO回歸模型的交叉驗證
lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000) lasso_cv.fit(X_train, y_train) # 輸出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_ lasso_best_alpha
# 基於最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000) lasso.fit(X_train, y_train) # 返回LASSO回歸的系數
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist()) # 預測
lasso_predict = lasso.predict(X_test) # 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict)) RMSE
交叉驗證
將所以數據參與到魔性的構建和測試中,最后生成多個模型再從多個模型中篩選出得分最高(准確度)的模型
Logistic回歸模型
將線性回歸模型的公式做Logit變換即為Logistic回歸模型
將預測問題變成了0到1之間的概率問題
混淆矩陣
准確率:表示正確預測的正負樣本與所以贗本數量額比值,即(A+D)/(A+B+C+D)
正例覆蓋率L表示預測的正例數在實際正例數中的比例,即D/(B+D)
負例覆蓋率:表示正確的負例數在實際負例數中的比例,即A/(A+C)
正例命中率:表示正確預測的正例數在預測正例數中 的比例,即D/(C+D)
模型的評估方法
1.ROC曲線
通過計算AUC陰影部分的面積來判斷模型是否合理(通常大於0.8表示OK)
2.KS曲線
通過計算兩條折線之間的最大距離來衡量模型是否合理(通常大於0.4表示OK)
決策樹與隨機森林
決策樹與隨機森林
默認情況下解決分類問題(買與不買、帶與不帶、走與不走)
也可以切換算法解決預測問題(具體數值的多少)
數其實是一種計算機底層的數據結構,與現實不同計算機里面的數都是自上而下的生長
決策樹則是算法模型中的一種概念 有三個主要的部分
根節點、枝節點、葉子節點
根節點與枝節點用於存放條件 葉子節點存放真正的數據結果
1.信息熵
eg:信息熵小相當於紅綠燈的情況 信息熵大就相當於買彩票中獎的情況
2.條件熵
條件熵其實就是由信息熵再次細分而來
比如 有九個用戶購買了商品五個沒有購買,那么條件熵就是繼續從購買不購買的用戶中在選擇一個條件(比如按照性別計算男個女的熵)
3.信息增益
信息增益可以反映出某個條件石是否對於最終的分類有決定性的影響
在構架決策樹是根節點與枝節點所放的條件按照信息增益由大到小排列
4.信息增益率
決策樹中的ID3算法使用信息增益指標實現根節點或中間節點的字段選擇,但是該指標存在一個非常明顯的缺點,即信息增益會偏向於取值較多的字段
為了克服信息增益指標的缺點,提出了信息增益率的概念,它的思想很簡單,就是在信息增益的基礎上進行相應的懲罰項
基尼指數
可以讓模型解決預測問題
基尼指數增益
與信息增益類似,還需要考慮自變量對因變量的影響過程,即因變量的基尼指數下降速度的快慢,下降的越快,自變量對因變量的影響就越強
隨機森林
隨機森林中每顆決策樹都不會限制節點字段的選擇,有多顆樹組組成的名叫隨機森林
在解決分類問題的時候采用投票法、解決預測問題的時候采用均值法
# 導入第三方模塊 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn import model_selection from sklearn import linear_model # 讀⼊數據 Titanic = pd.read_csv(r'Titanic.csv') Titanic # 刪除⽆意義的變量,並檢查剩余變量是否含有缺失值 Titanic.drop(['PassengerId','Name','Ticket','Cabin'], axis = 1, inplace = True) Titanic.isnull().sum(axis = 0) # 對Sex分組,⽤各組乘客的平均年齡填充各組中的缺失年齡 fillna_Titanic = [] for i in Titanic.Sex.unique(): update = Titanic.loc[Titanic.Sex == i,].fillna(value = {'Age': Titanic.Age[Titanic.Sex == i].mean()}, inplace = False) fillna_Titanic.append(update) Titanic = pd.concat(fillna_Titanic) # 使⽤Embarked變量的眾數填充缺失值 Titanic.fillna(value = {'Embarked':Titanic.Embarked.mode()[0]}, inplace=True)
# 將數值型的Pclass轉換為類別型,否則⽆法對其啞變量處理 Titanic.Pclass = Titanic.Pclass.astype('category') # 啞變量處理 dummy = pd.get_dummies(Titanic[['Sex','Embarked','Pclass']]) # ⽔平合並Titanic數據集和啞變量的數據集 Titanic = pd.concat([Titanic,dummy], axis = 1) # 刪除原始的Sex、Embarked和Pclass變量 Titanic.drop(['Sex','Embarked','Pclass'], inplace=True, axis = 1) # 取出所有⾃變量名稱 predictors = Titanic.columns[1:] # 將數據集拆分為訓練集和測試集,且測試集的⽐例為25% X_train, X_test, y_train, y_test = model_selection.train_test_split(Titanic[predictors], Titanic.Survived, test_size = 0.25, random_state = 1234)
K近鄰模型
思想:根據位置樣本周邊的K個鄰居樣本來完成預測或者分類
K值的選擇
1.先猜測
2.交叉驗證
3.作圖選擇最合理的K值(准確率越大越好,MSE越小越好)
過擬合與欠擬合
過擬合:
模型過度擬合,在訓練集上表現好,但是在測試集上效果差,也就是說在已知的數據集合中非常好,
但是在添加一些新的數據進來訓練效果就會差很多,造成這樣的原因是考慮影響因素太多,超出自變量的維度過於多了。
欠擬合:
模型擬合不夠,在訓練集上表現效果差,沒有充分的利用數據,預測的准確度低。
距離
歐式距離 兩點之間的距離
曼哈頓距離 默認兩點之間有障礙物
余弦相似度 論文查重