二元分类问题搭建逻辑回归模型
生活随笔
收集整理的這篇文章主要介紹了
二元分类问题搭建逻辑回归模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.讀取數據——pandas
#利用pandas讀取數據 import pandas as pd data = pd.read_csv(r"H:\Python\data\adult.data") cols = ['age','education_num','capital_gain','capital_loss','hours_per_week','label'] data = data[cols] data.head(8)運行結果:
2.數據轉換及可視化——pandas
#利用pandas進行數據轉換和可視化,pandas可以將文字型類別變量轉換為數字變量 data["label_code"] = pd.Categorical(data.label).codes #在原數據上生成一個變量“label_code”,這個變量只有兩個值:0表示“<=50K”,1表示“>50K” data[["label","label_code"]].head(8) import matplotlib.pyplot as plt data[["age","hours_per_week","education_num","label_code"]].hist() plt.show(block=False)運行結果:
3.數據的基本統計信息——pandas
#利用DataFrame的describe函數可以得到數據的基本統計信息,如平均值,均方差等。 #默認的describe智慧顯示數值型變量的統計信息,如果想要得到全部變量的統計信息,可使用“describe(include='all')” data.describe()運行結果:
4.計算交叉報表
#計算education_num,label交叉報表 #pd.crosstab(pd.qcut(data["education_num"],[0,0.25,0.5,0.75,1]))表示將變量“education_num”按分位數劃分為4個區間 cross1 = pd.crosstab(pd.qcut(data["education_num"],[0,0.25,0.5,0.75,1]),data["label"]) print(cross1) #將交叉圖標圖像化 from statsmodels.graphics.mosaicplot import mosaic mosaic(cross1.stack())運行結果:
5.計算交叉報表,并歸一化
#計算hours_per_week,label交叉報表 cross2 = pd.crosstab(pd.cut(data["hours_per_week"],5),data["label"]) #將交叉表歸一化,利于分析數據 cross2_norm = cross2.div(cross2.sum(1).astype(float),axis=0) cross2_norm.plot(kind="bar") plt.show(block=False)運行結果:
6.理解模型結果
#理解模型結果 def interpreModel(re):"""理解模型結果參數---re:BinaryResults,訓練好的邏輯回歸模型"""conf = re.conf_int()conf['OR'] = re.params#計算各個變量對時間發生比的影響#以conf里面的3列,分別對應著估計值的下界、上界和估計值本身conf.colums = ['2.5%','97.5','OR']print("各個變量對事件發生比的影響: ")print(np.exp(conf))#計算各個變量的邊際效應print("各個變量的邊際效應:")print(re.get_margeff(at="overall").summary())運行結果:
7. 評估模型效果
#評估模型效果 def makePrediction(re,testSet,alpha=0.5):"""使用訓練好的模型對預測數據作預測"""#計算事件發生的概率testSet["prob"] = re.predict(testSet)print("事件發生概率(預測概率)大于0.6的數據個數:")print(testSet[testSet["prob"]>0.6].shape[0]) print("事件發生概率(預測概率)大于0.5的數據個數:")print(testSet[testSet["prob"]>0.5].shape[0])#根據預測的概率,得出最終的預測testSet["pred"] = testSet.apply(lambda x:1 if x["prob"]>alpha else 0,axis=1)return testSet運行結果:
8.查準率與查全率評估指標
def evaluation(re):"""計算預測結果的查準查全率以及f1參數----re :DataFrame,預測結果,里面包含兩列:真實值‘lable_code’、預測值‘pred’"""bins = np.array([0, 0.5, 1])label = re["label_code"]pred = re["pred"]tp, fp, fn, tn = np.histogram2d(label, pred, bins=bins)[0].flatten()precision = tp / (tp + fp) # 0.951recall = tp / (tp + fn) # 0.826f1 = 2 * precision * recall / (precision + recall) # 0.884print("查準率: %.3f, 查全率: %.3f, f1: %.3f" % (precision, recall, f1))運行結果:
完整版代碼,使用第三方庫Statsmodels搭建模型
import matplotlib.pyplot as plt import pandas as pd import os import numpy as np import statsmodels.api as sm from statsmodels.graphics.mosaicplot import mosaic #將交叉圖標圖像化 from sklearn.model_selection import train_test_split #將數據集劃分為訓練集和測試集,防治過擬合def readData(path): #利用pandas讀取數據data = pd.read_csv(path)cols = ['age','education_num','capital_gain','capital_loss','hours_per_week','label']return data[cols]def logitRegression(data):"""邏輯回歸模型分析步驟展示參數---data:DataFrame,建模數據"""data = transLabel(data)visualData(data)analyseData(data)#將數據分為訓練集和測試集trainSet,testSet = train_test_split(data,test_size=0.2, random_state=2310)#測試集占20%#訓練模型并分析模型效果re = trainModel(trainSet)modelSummary(re)interpreModel(re)re = makePrediction(re,testSet,alpha=0.5)evaluation(re)def transLabel(data):"""將文字變量轉化為數字變量"""data["label_code"] = pd.Categorical(data.label).codesreturn datadef visualData(data):data[["age","hours_per_week","education_num","label_code"]].hist()plt.show(block=False)def analyseData(data):"""通過統計方法,了解數據性質"""# 在Windows下運行此腳本需確保Windows下的命令提示符(cmd)能顯示中文print("顯示基本統計信息:")print(data.describe(include="all"))# 計算education_num, label交叉報表cross1 = pd.crosstab(pd.qcut(data["education_num"], [0, .25, .5, .75, 1]), data["label"])print("顯示education_num, label交叉報表:")print(cross1)# 將交叉報表圖形化props = lambda key: {"color": "0.45"} if ' >50K' in key else {"color": "#C6E2FF"}mosaic(cross1[[" >50K", " <=50K"]].stack(), properties=props)# 計算hours_per_week, label交叉報表cross2 = pd.crosstab(pd.cut(data["hours_per_week"], 5), data["label"])# 將交叉報表歸一化,利于分析數據cross2_norm = cross2.div(cross2.sum(1).astype(float), axis=0)print("顯示hours_per_week, label交叉報表:")print(cross2_norm)# 圖形化歸一化后的交叉報表cross2_norm.plot(kind="bar", color=["#C6E2FF", "0.45"], rot=0)plt.show()def trainModel(data):"""搭建邏輯回歸模型,并訓練模型"""formula = "label_code ~ age + education_num + capital_gain + capital_loss + hours_per_week"model = sm.Logit.from_formula(formula,data=data)re = model.fit()return redef modelSummary(re):"""分析邏輯回歸模型的統計性質"""#整體統計分析結果print(re.summary())#用f test 檢驗education_num的系數是否顯著print("檢驗假設education_num的系數等于0:")print(re.f_test("education_num=0"))#用f test檢驗兩個假設是否同時成立print("檢驗假設education_num的系數等于0.32和hours_per_week的系數等于0.04同時成立")print(re.f_test("education_num=0.32,hours_per_week=0.04"))#理解模型結果 def interpreModel(re):"""理解模型結果參數---re:BinaryResults,訓練好的邏輯回歸模型"""conf = re.conf_int()conf['OR'] = re.params#計算各個變量對時間發生比的影響#以conf里面的3列,分別對應著估計值的下界、上界和估計值本身conf.colums = ['2.5%','97.5','OR']print("各個變量對事件發生比的影響: ")print(np.exp(conf))#計算各個變量的邊際效應print("各個變量的邊際效應:")print(re.get_margeff(at="overall").summary())#評估模型效果 def makePrediction(re,testSet,alpha=0.5):"""使用訓練好的模型對預測數據作預測"""#計算事件發生的概率testSet["prob"] = re.predict(testSet)print("事件發生概率(預測概率)大于0.6的數據個數:")print(testSet[testSet["prob"]>0.6].shape[0]) print("事件發生概率(預測概率)大于0.5的數據個數:")print(testSet[testSet["prob"]>0.5].shape[0])#根據預測的概率,得出最終的預測testSet["pred"] = testSet.apply(lambda x:1 if x["prob"]>alpha else 0,axis=1)return testSet#評估指標 def evaluation(re):"""計算預測結果的查準查全率以及f1參數----re :DataFrame,預測結果,里面包含兩列:真實值‘lable_code’、預測值‘pred’"""bins = np.array([0, 0.5, 1])label = re["label_code"]pred = re["pred"]tp, fp, fn, tn = np.histogram2d(label, pred, bins=bins)[0].flatten()precision = tp / (tp + fp) # 0.951recall = tp / (tp + fn) # 0.826f1 = 2 * precision * recall / (precision + recall) # 0.884print("查準率: %.3f, 查全率: %.3f, f1: %.3f" % (precision, recall, f1))if __name__ == "__main__":# 設置顯示格式pd.set_option('display.width', 1000)homePath = os.path.dirname(os.path.abspath(__file__))# Windows下的存儲路徑與Linux并不相同if os.name == "nt":dataPath = "%s\\data\\adult.data" % homePathelse:dataPath = "%s/data/adult.data" % homePathdata = readData(dataPath)logitRegression(data)注:出現這個錯誤,更新自己的statsmodels庫,我更新到0.9.0版本就好了
總結
以上是生活随笔為你收集整理的二元分类问题搭建逻辑回归模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Botball比赛5岁孩子参加有意义吗
- 下一篇: Maple中使用注意事项