日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二元分类问题搭建逻辑回归模型

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二元分类问题搭建逻辑回归模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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版本就好了



總結

以上是生活随笔為你收集整理的二元分类问题搭建逻辑回归模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂中文视频在线 | 伊人午夜 | 欧美激情校园春色 | 黄片毛片av | 国产av一区二区不卡 | 17草在线| 成年人在线免费观看网站 | 国产视频不卡 | 色噜噜综合 | 精品自拍av| 不卡av电影在线观看 | 欧美亚洲天堂 | 午夜激情在线观看视频 | 天天看天天色 | 一区二区三区人妻 | 日韩二区 | 成人免费毛片男人用品 | 性欧美videos高清hd4k | 精品一区二区三区精华液 | 打屁股无遮挡网站 | 亚洲一区二区精品在线 | 日韩三区在线观看 | 男女网站在线观看 | 男人天堂a在线 | 91丝袜一区二区三区 | 尤物国产精品 | 欧美青青草| 97伊人超碰| 欧美| 久久久久一区二区精码av少妇 | 日韩和欧美一区二区 | 午夜寂寞视频 | 精品国产18久久久久久 | 91视频在线免费观看 | 依人综合 | 国产精华一区二区三区 | 久久精精品久久久久噜噜 | 亚洲精品在线不卡 | 国产91在线免费 | 欧美午夜激情影院 | 四季av一区二区凹凸精品 | yjizz视频网 国产乱人对白 | 国产女人高潮毛片 | 国产精品久久久久影院色老大 | 国产真实的和子乱拍在线观看 | 亚洲天堂男 | 人妻无码一区二区三区免费 | 国产13页| 九九热在线视频 | 久久资源av | 午夜av免费观看 | 欧美视频你懂的 | 国产人妻精品一区二区三区 | 色婷婷麻豆 | 欧美亚洲日本一区 | 国产精品视频福利 | 好吊色在线观看 | 在线无码va中文字幕无码 | 网址av | 中文字幕在线网站 | 久久精品美女 | 91精品国产综合久久久久 | 国产精品wwww | 少妇人妻偷人精品无码视频新浪 | 成人午夜精品无码区 | 人人爱操| 中文字幕在线精品 | 在线免费国产视频 | 午夜一区 | 欧美少妇性生活 | h网站在线播放 | 日韩欧美一区二区三区视频 | 激情五月视频 | 香蕉视频在线免费播放 | 97中文字幕在线观看 | 一区二区三区视频免费 | 免费观看高清在线 | 夜夜爽av| 国产极品久久 | 爱草在线视频 | 午夜精品在线观看 | 奶罩不戴乳罩邻居hd播放 | 四虎新网站 | 国语对白清晰刺激对白 | 久久久777| 久久艳片www.17c.com | 制服 丝袜 激情 欧洲 亚洲 | 屁屁影院第一页 | 打屁股疼的撕心裂肺的视频 | 日韩tv | 日韩精品一区二区亚洲av | 中文字幕在线观 | 日本黄色小说 | 日本精品网站 | 亚洲国产日韩欧美 | 在线观看国产一区二区三区 | 国产日产精品一区二区三区 | 嫩模啪啪| 欧美高清一区二区 |