基于sklearn隨機(jī)森林算法探究肥胖的成因(二)
2022-12-31 713 發(fā)布于黑龍江
版權(quán)
舉報(bào)
版權(quán)聲明:
本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《 阿里云開(kāi)發(fā)者社區(qū)用戶服務(wù)協(xié)議》和 《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫(xiě) 侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。
實(shí)驗(yàn)步驟
1.導(dǎo)入模塊與數(shù)據(jù)
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split import seaborn as sns from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import confusion_matrix,accuracy_score import warnings warnings.filterwarnings('ignore') plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus']=False # 導(dǎo)入數(shù)據(jù) data = pd.read_csv('data.csv') data.head()
Age Height Weight family_history_with_overweight FAVC FCVC NCP CAEC SMOKE CH2O SCC FAF TUE CALC MTRANS NObeyesdad 0 Female 21.0 1.62 64.0 yes no 2.0 3.0 Sometimes no 2.0 no 0.0 1.0 no Public_Transportation Normal_Weight 1 Female 21.0 1.52 56.0 yes no 3.0 3.0 Sometimes yes 3.0 yes 3.0 0.0 Sometimes Public_Transportation Normal_Weight 2 Male 23.0 1.80 77.0 yes no 2.0 3.0 Sometimes no 2.0 no 2.0 1.0 Frequently Public_Transportation Normal_Weight 3 Male 27.0 1.80 87.0 no no 3.0 3.0 Sometimes no 2.0 no 2.0 0.0 Frequently Walking Overweight_Level_I 4 Male 22.0 1.78 89.8 no no 2.0 1.0 Sometimes no 2.0 no 0.0 0.0 Sometimes Public_Transportation Overweight_Level_II
2.查看數(shù)據(jù)
該數(shù)據(jù)共有2111行,17列數(shù)據(jù)
Gender object Age float64 Height float64 Weight float64 family_history_with_overweight object FAVC object FCVC float64 NCP float64 CAEC object SMOKE object CH2O float64 SCC object FAF float64 TUE float64 CALC object MTRANS object NObeyesdad object dtype: object
數(shù)據(jù)類(lèi)型有object和float兩種類(lèi)型
# 查看數(shù)值型數(shù)據(jù)描述 data.describe()
Age Height Weight FCVC NCP CH2O FAF TUE count 2111.000000 2111.000000 2111.000000 2111.000000 2111.000000 2111.000000 2111.000000 2111.000000 mean 24.312600 1.701677 86.586058 2.419043 2.685628 2.008011 1.010298 0.657866 std 6.345968 0.093305 26.191172 0.533927 0.778039 0.612953 0.850592 0.608927 min 14.000000 1.450000 39.000000 1.000000 1.000000 1.000000 0.000000 0.000000 25% 19.947192 1.630000 65.473343 2.000000 2.658738 1.584812 0.124505 0.000000 50% 22.777890 1.700499 83.000000 2.385502 3.000000 2.000000 1.000000 0.625350 75% 26.000000 1.768464 107.430682 3.000000 3.000000 2.477420 1.666678 1.000000 max 61.000000 1.980000 173.000000 3.000000 4.000000 3.000000 3.000000 2.000000
可以看出數(shù)值型數(shù)據(jù)的總數(shù)、平均值、標(biāo)準(zhǔn)差、最大最小值、4分位值
# 查看非數(shù)值型數(shù)據(jù)描述
# 查看非數(shù)值型數(shù)據(jù)描述 data.describe(include=np.object)
Gender family_history_with_overweight FAVC CAEC SMOKE SCC CALC MTRANS NObeyesdad count 2111 2111 2111 2111 2111 2111 2111 2111 2111 unique 2 2 2 4 2 2 4 5 7 top Male yes yes Sometimes no no Sometimes Public_Transportation Obesity_Type_I freq 1068 1726 1866 1765 2067 2015 1401 1580 351
可以看出非數(shù)值型數(shù)據(jù)的總數(shù)、數(shù)值類(lèi)型的個(gè)數(shù)、出現(xiàn)次數(shù)最多的值以及出現(xiàn)的頻率
3.數(shù)據(jù)預(yù)處理
# 查看缺失值 data.isnull().sum()
Gender 0 Age 0 Height 0 Weight 0 family_history_with_overweight 0 FAVC 0 FCVC 0 NCP 0 CAEC 0 SMOKE 0 CH2O 0 SCC 0 FAF 0 TUE 0 CALC 0 MTRANS 0 NObeyesdad 0 dtype: int64
可以看出數(shù)據(jù)沒(méi)有缺失值,不需要處理
# 查看重復(fù)值 any(data.duplicated())
data.duplicated()返回的是一堆布爾值,重復(fù)數(shù)據(jù)第一次出現(xiàn)為False,第二次以后均為T(mén)rue,故我們可以用any()函數(shù)來(lái)進(jìn)行判斷,當(dāng)數(shù)據(jù)只要有有一個(gè)重復(fù)值,則最終結(jié)果為T(mén)rue,否則為False。本次為T(mén)rue,說(shuō)明數(shù)據(jù)存在重復(fù)值。需要處理
# 刪除重復(fù)行 data.drop_duplicates(inplace=True) data.shape
原始數(shù)據(jù)有2111行,刪除重復(fù)值還剩2087行
4.可視化分析
不同肥胖程度的總?cè)藬?shù)
data['NObeyesdad'].value_counts().plot.barh()
我們可以看出不同程度的人數(shù)相差不大
分析不同肥胖程度的男女比例
sex_group = data.groupby(['NObeyesdad','Gender'])['Gender'].count() sex_group sex_group.plot(kind='bar')
NObeyesdad Gender Insufficient_Weight Female 169 Male 98 Normal_Weight Female 137 Male 145 Obesity_Type_I Female 156 Male 195 Obesity_Type_II Female 2 Male 295 Obesity_Type_III Female 323 Male 1 Overweight_Level_I Female 145 Male 131 Overweight_Level_II Female 103 Male 187 Name: Gender, dtype: int64
在體重瘦弱人數(shù)中,女性遠(yuǎn)多于男性;在肥胖2級(jí)人數(shù)中,男性遠(yuǎn)超過(guò)女性;在肥胖3級(jí)人數(shù)中,女性遠(yuǎn)超過(guò)男性;其余比例相差不大。
分析家庭肥胖歷史對(duì)肥胖程度的影響
family_group = data.groupby(['NObeyesdad','family_history_with_overweight'])['family_history_with_overweight'].count() family_group family_group.plot.bar()
NObeyesdad family_history_with_overweight Insufficient_Weight no 142 yes 125 Normal_Weight no 130 yes 152 Obesity_Type_I no 7 yes 344 Obesity_Type_II no 1 yes 296 Obesity_Type_III yes 324 Overweight_Level_I no 67 yes 209 Overweight_Level_II no 18 yes 272 Name: family_history_with_overweight, dtype: int64
我們可以看出肥胖1-3級(jí)和超重1-2級(jí)的人數(shù)幾乎都有家庭肥胖歷史,說(shuō)明家庭肥胖是可以遺傳給后代的。
特征相關(guān)性分析
#相關(guān)性 import seaborn as sns fig = plt.figure(figsize=(18,18)) sns.heatmap(data.corr(),vmax=1)
畫(huà)出熱力圖便于觀察個(gè)特征之間的相關(guān)性,顏色越深說(shuō)明相關(guān)性越強(qiáng)
5.特征工程
為了后面更好的建立模型,我們將NObeyesdad肥胖等級(jí)用0-6來(lái)表示 體重不足、正常體重、超重一級(jí)、超重二級(jí)、肥胖一級(jí)、肥胖二級(jí)和肥胖三級(jí);將CAEC、CALC的值用1-4表示;將MTRANS值用1-5表示;將family_history_with_overweight、FAVC、SMOKE、SCC、Gender的值用0,1表示。
# 將NObeyesdad肥胖等級(jí)用0-6來(lái)表示 體重不足、正常體重、超重一級(jí)、超重二級(jí)、肥胖一級(jí)、肥胖二級(jí)和肥胖三級(jí) data.NObeyesdad.replace(to_replace={'Insufficient_Weight':0, 'Normal_Weight':1, 'Overweight_Level_I':2, 'Overweight_Level_II':3, 'Obesity_Type_I':4, 'Obesity_Type_II':5, 'Obesity_Type_III':6},inplace=True) data['NObeyesdad'].value_counts() # 將CAEC、CALC的值用1-4表示 data.CAEC.replace(to_replace={'no':1, 'Sometimes':2, 'Frequently':3, 'Always':4},inplace=True) data.CALC.replace(to_replace={'no':1, 'Sometimes':2, 'Frequently':3, 'Always':4},inplace=True) # 將MTRANS值用1-5表示 data.MTRANS.replace(to_replace={'Bike':1, 'Motorbike':2, 'Walking':3, 'Automobile':4, 'Public_Transportation':5},inplace=True) # 將family_history_with_overweight、FAVC、SMOKE、SCC、Gender的值用0,1表示 data['family_history_with_overweight'] = data['family_history_with_overweight'].apply(lambda x:0 if x == 'no' else 1) data['FAVC'] = data['FAVC'].apply(lambda x:0 if x == 'no' else 1) data['SMOKE'] = data['SMOKE'].apply(lambda x:0 if x == 'no' else 1) data['SCC'] = data['SCC'].apply(lambda x:0 if x == 'no' else 1) data['Gender'] = data['Gender'].apply(lambda x:0 if x == 'Female' else 1)
來(lái)看一下經(jīng)過(guò)值變換后的結(jié)果
Gender Age Height Weight family_history_with_overweight FAVC FCVC NCP CAEC SMOKE CH2O SCC FAF TUE CALC MTRANS NObeyesdad 0 0 21.0 1.62 64.0 1 0 2.0 3.0 2 0 2.0 0 0.0 1.0 1 5 1 1 0 21.0 1.52 56.0 1 0 3.0 3.0 2 1 3.0 1 3.0 0.0 2 5 1 2 1 23.0 1.80 77.0 1 0 2.0 3.0 2 0 2.0 0 2.0 1.0 3 5 1 3 1 27.0 1.80 87.0 0 0 3.0 3.0 2 0 2.0 0 2.0 0.0 3 3 2 4 1 22.0 1.78 89.8 0 0 2.0 1.0 2 0 2.0 0 0.0 0.0 2 5 3 5 1 29.0 1.62 53.0 0 1 2.0 3.0 2 0 2.0 0 0.0 0.0 2 4 1 6 0 23.0 1.50 55.0 1 1 3.0 3.0 2 0 2.0 0 1.0 0.0 2 2 1 7 1 22.0 1.64 53.0 0 0 2.0 3.0 2 0 2.0 0 3.0 0.0 2 5 1 8 1 24.0 1.78 64.0 1 1 3.0 3.0 2 0 2.0 0 1.0 1.0 3 5 1 9 1 22.0 1.72 68.0 1 1 2.0 3.0 2 0 2.0 0 1.0 1.0 1 5 1
6.構(gòu)建模型
首先要?jiǎng)澐謹(jǐn)?shù)據(jù)集
# 劃分訓(xùn)練集和測(cè)試集 X = data.drop('NObeyesdad',axis=1) y = data['NObeyesdad'] x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
1.構(gòu)建決策樹(shù)模型
# 決策樹(shù) tree = DecisionTreeClassifier() tree.fit(x_train,y_train) y_pred = tree.predict(x_test) print('模型準(zhǔn)確率',accuracy_score(y_test,y_pred)) print(confusion_matrix(y_test,y_pred))
模型準(zhǔn)確率 0.9138755980861244 [[54 5 0 0 0 0 0] [ 8 42 11 0 0 0 0] [ 0 4 49 1 1 0 0] [ 0 0 0 47 2 0 0] [ 0 0 0 2 67 1 0] [ 0 0 0 0 1 63 0] [ 0 0 0 0 0 0 60]]
我們可以看出決策樹(shù)模型的準(zhǔn)確率為0.91,下面是它的混淆矩陣
2.構(gòu)建隨機(jī)森林模型
# 訓(xùn)練模型 rfc = RandomForestClassifier(n_estimators=1000) rfc.fit(x_train,y_train) y_pred = rfc.predict(x_test) print('模型準(zhǔn)確率',accuracy_score(y_test,y_pred)) print(confusion_matrix(y_test,y_pred)) #打印特征重要性評(píng)分 feat_labels = x_train.columns[0:] importances = rfc.feature_importances_ indices = np.argsort(importances)[::-1] for f,j in zip(range(x_train.shape[1]-1),indices): print(f + 1, feat_labels[j], importances[j])
模型準(zhǔn)確率 0.9688995215311005 [[56 3 0 0 0 0 0] [ 1 58 2 0 0 0 0] [ 0 4 50 1 0 0 0] [ 0 0 0 49 0 0 0] [ 0 0 0 2 68 0 0] [ 0 0 0 0 0 64 0] [ 0 0 0 0 0 0 60]] 1 Weight 0.3461717299548839 2 Height 0.10306677126361354 3 Age 0.09179444276446319 4 FCVC 0.08913744112847972 5 Gender 0.060092403930844605 6 NCP 0.05001535496608815 7 TUE 0.0453552733033558 8 FAF 0.041620900666372085 9 CH2O 0.040322835978721744 10 family_history_with_overweight 0.031376522711946964 11 CAEC 0.029667089265592847 12 CALC 0.028755767084792445 13 MTRANS 0.01894906014847046 14 FAVC 0.016471000893701973 15 SCC 0.0051458394162270426
我們可以看出隨機(jī)森林模型的準(zhǔn)確率為0.968,其中重要特征排名中,體重、身高、年齡、食用蔬菜的評(píng)率、性別、主餐次數(shù)等因素重要程度得分較高,說(shuō)明重要程度越高。
3.構(gòu)建GBDT模型
from sklearn.ensemble import GradientBoostingClassifier gbdt = GradientBoostingClassifier() gbdt.fit(x_train,y_train) y_pred = gbst.predict(x_test) print('模型準(zhǔn)確率',accuracy_score(y_pred,y_test)) print(confusion_matrix(y_test,y_pred))
模型準(zhǔn)確率 0.9617224880382775 [[54 5 0 0 0 0 0] [ 3 53 5 0 0 0 0] [ 0 1 54 0 0 0 0] [ 0 0 0 49 0 0 0] [ 0 0 0 1 69 0 0] [ 0 0 0 0 1 63 0] [ 0 0 0 0 0 0 60]]
我們可以看出模型的準(zhǔn)確率為0.96,準(zhǔn)確率較高
綜上3種分類(lèi)模型算法,隨機(jī)森林模型的準(zhǔn)確率最高,我們建議用隨機(jī)森林來(lái)進(jìn)行預(yù)測(cè)和探究肥胖的成因。
實(shí)驗(yàn)總結(jié)
肥胖是一種全球性的疾病,無(wú)論人們的社會(huì)或文化水平如何,它始終都是熱點(diǎn)話題,而且全球患者的數(shù)量逐年增長(zhǎng)。為了幫助對(duì)抗這種疾病,開(kāi)發(fā)工具和解決方案去檢測(cè)或預(yù)測(cè)疾病的出現(xiàn)顯得非常重要,而數(shù)據(jù)挖掘是讓我們發(fā)現(xiàn)信息的重要工具。
本文使用隨機(jī)森林算法對(duì)數(shù)據(jù)集進(jìn)行處理,通過(guò)對(duì)多個(gè)影響因子進(jìn)行多標(biāo)簽分類(lèi)獲取各影響因子與肥胖水平之間的權(quán)值,由此建立肥胖評(píng)估模型,模型準(zhǔn)確率達(dá)到96%,從而探究肥胖的成因。實(shí)驗(yàn)結(jié)果表明了眾多影響因子與肥胖水平之間的關(guān)系,肥胖家族病史與肥胖水平之間強(qiáng)正相關(guān),年齡以及是否經(jīng)常食用高熱量也與肥胖水平之間呈較強(qiáng)的正相關(guān)關(guān)系,也就是說(shuō),通常有肥胖家族病史的人患病可能性更大,年齡越大以及經(jīng)常食用高熱量食物的人更容易肥胖;是否進(jìn)行卡路里消耗監(jiān)測(cè)以及是否經(jīng)常活動(dòng)身體等與肥胖水平有著負(fù)相關(guān)關(guān)系,換言之,規(guī)律的監(jiān)測(cè)卡路里消耗以及頻繁的身體活動(dòng)可以降低患病幾率;是否頻繁飲酒、長(zhǎng)時(shí)間使用技術(shù)設(shè)備每日飲水量等對(duì)肥胖水平有一定影響。
因此,根據(jù)實(shí)驗(yàn)結(jié)果,要想控制肥胖應(yīng)努力加強(qiáng)家庭可以采用的健康習(xí)慣,例如均衡白天的飲食、確定飲食時(shí)間、少吃高熱量的食物、降低飲酒頻率等;必須認(rèn)識(shí)到,除了飲食變化外,增加日常體育活動(dòng),例如每天至少步行半小時(shí),每天至少喝兩升水,是必不可少的,因?yàn)闆](méi)有不鍛煉的飲食;對(duì)卡路里消耗進(jìn)行規(guī)律檢測(cè),減少使用技術(shù)設(shè)備的時(shí)間等。兒童和成人的高肥胖率是導(dǎo)致總體肥胖率較高的原因,我們?cè)僖膊荒軐?duì)此視而不見(jiàn),應(yīng)在生命早期階段就進(jìn)行預(yù)防和控制,這樣才能可持續(xù)的解決肥胖問(wèn)題,而我們每一個(gè)人也應(yīng)該提高認(rèn)識(shí),養(yǎng)成健康的生活習(xí)慣。
隨著云計(jì)算、物聯(lián)網(wǎng)和移動(dòng)互聯(lián)網(wǎng)等技術(shù)的飛速發(fā)展,數(shù)據(jù)的類(lèi)型和規(guī)模以前所未有的速度增長(zhǎng),而人工智能和數(shù)據(jù)挖掘的快速發(fā)展提高了數(shù)據(jù)管理效率。通過(guò)本實(shí)驗(yàn)對(duì)實(shí)際案例的研究與學(xué)習(xí),對(duì)數(shù)據(jù)挖掘有關(guān)的知識(shí)有了初步的了解,為以后繼續(xù)學(xué)習(xí)數(shù)據(jù)挖掘與分析奠定了基礎(chǔ)。
因?yàn)閷?duì)數(shù)據(jù)挖掘不夠了解,實(shí)驗(yàn)過(guò)程中遇到了很多問(wèn)題。實(shí)驗(yàn)仍存在很多問(wèn)題,如實(shí)驗(yàn)結(jié)果與實(shí)際情況存在偏差,模型準(zhǔn)確率有待提高;算法的很多代碼不夠完善,存在漏洞;對(duì)實(shí)驗(yàn)結(jié)果分析不夠深入,有待進(jìn)一步挖掘等等。針對(duì)這些不足,在今后不斷學(xué)習(xí)過(guò)程中會(huì)不斷完善。
相關(guān)知識(shí)
森林如何“治愈”人類(lèi)?記者探訪國(guó)內(nèi)首個(gè)森林療養(yǎng)基地
自然的療愈力:河流與森林何以有益于人類(lèi)健康?
關(guān)于發(fā)展森林康養(yǎng)產(chǎn)業(yè)與中青年心理療愈結(jié)合必要性研究
森林康復(fù)與康養(yǎng)旅游
森林康養(yǎng)與綠色健康
森林療愈:大自然的綠色奇跡
森林療養(yǎng)與人群健康
自然療愈與森林公園生態(tài)旅游.docx
短期森林療養(yǎng)活動(dòng)對(duì)年輕健康個(gè)體部分身心健康指標(biāo)的影響
胖也要分類(lèi)?人工智能+肥胖癥=肥胖癥的AIM分型
網(wǎng)址: 基于sklearn隨機(jī)森林算法探究肥胖的成因(二) http://m.u1s5d6.cn/newsview120637.html
推薦資訊
- 1發(fā)朋友圈對(duì)老公徹底失望的心情 12775
- 2BMI體重指數(shù)計(jì)算公式是什么 11235
- 3補(bǔ)腎吃什么 補(bǔ)腎最佳食物推薦 11199
- 4性生活姿勢(shì)有哪些 盤(pán)點(diǎn)夫妻性 10428
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計(jì)算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828