首頁 資訊 基于sklearn隨機森林算法探究肥胖的成因(二)

基于sklearn隨機森林算法探究肥胖的成因(二)

來源:泰然健康網(wǎng) 時間:2024年11月27日 00:09

2022-12-31 713 發(fā)布于黑龍江

版權(quán)

舉報

版權(quán)聲明:

本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《 阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和 《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫 侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。

實驗步驟

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ù)類型有object和float兩種類型

# 查看數(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ù)值類型的個數(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ù)沒有缺失值,不需要處理

# 查看重復(fù)值 any(data.duplicated())

data.duplicated()返回的是一堆布爾值,重復(fù)數(shù)據(jù)第一次出現(xiàn)為False,第二次以后均為True,故我們可以用any()函數(shù)來進行判斷,當(dāng)數(shù)據(jù)只要有有一個重復(fù)值,則最終結(jié)果為True,否則為False。本次為True,說明數(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ù)中,女性遠多于男性;在肥胖2級人數(shù)中,男性遠超過女性;在肥胖3級人數(shù)中,女性遠超過男性;其余比例相差不大。

分析家庭肥胖歷史對肥胖程度的影響

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級和超重1-2級的人數(shù)幾乎都有家庭肥胖歷史,說明家庭肥胖是可以遺傳給后代的。

特征相關(guān)性分析

#相關(guān)性 import seaborn as sns fig = plt.figure(figsize=(18,18)) sns.heatmap(data.corr(),vmax=1)

畫出熱力圖便于觀察個特征之間的相關(guān)性,顏色越深說明相關(guān)性越強

5.特征工程

       為了后面更好的建立模型,我們將NObeyesdad肥胖等級用0-6來表示 體重不足、正常體重、超重一級、超重二級、肥胖一級、肥胖二級和肥胖三級;將CAEC、CALC的值用1-4表示;將MTRANS值用1-5表示;將family_history_with_overweight、FAVC、SMOKE、SCC、Gender的值用0,1表示。

# 將NObeyesdad肥胖等級用0-6來表示 體重不足、正常體重、超重一級、超重二級、肥胖一級、肥胖二級和肥胖三級 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)

來看一下經(jīng)過值變換后的結(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)建模型

首先要劃分?jǐn)?shù)據(jù)集

# 劃分訓(xùn)練集和測試集 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)建決策樹模型

# 決策樹 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]]

我們可以看出決策樹模型的準(zhǔn)確率為0.91,下面是它的混淆矩陣

2.構(gòu)建隨機森林模型

# 訓(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)) #打印特征重要性評分 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

我們可以看出隨機森林模型的準(zhǔn)確率為0.968,其中重要特征排名中,體重、身高、年齡、食用蔬菜的評率、性別、主餐次數(shù)等因素重要程度得分較高,說明重要程度越高。

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種分類模型算法,隨機森林模型的準(zhǔn)確率最高,我們建議用隨機森林來進行預(yù)測和探究肥胖的成因。

實驗總結(jié)

       肥胖是一種全球性的疾病,無論人們的社會或文化水平如何,它始終都是熱點話題,而且全球患者的數(shù)量逐年增長。為了幫助對抗這種疾病,開發(fā)工具和解決方案去檢測或預(yù)測疾病的出現(xiàn)顯得非常重要,而數(shù)據(jù)挖掘是讓我們發(fā)現(xiàn)信息的重要工具。

       本文使用隨機森林算法對數(shù)據(jù)集進行處理,通過對多個影響因子進行多標(biāo)簽分類獲取各影響因子與肥胖水平之間的權(quán)值,由此建立肥胖評估模型,模型準(zhǔn)確率達到96%,從而探究肥胖的成因。實驗結(jié)果表明了眾多影響因子與肥胖水平之間的關(guān)系,肥胖家族病史與肥胖水平之間強正相關(guān),年齡以及是否經(jīng)常食用高熱量也與肥胖水平之間呈較強的正相關(guān)關(guān)系,也就是說,通常有肥胖家族病史的人患病可能性更大,年齡越大以及經(jīng)常食用高熱量食物的人更容易肥胖;是否進行卡路里消耗監(jiān)測以及是否經(jīng)常活動身體等與肥胖水平有著負相關(guān)關(guān)系,換言之,規(guī)律的監(jiān)測卡路里消耗以及頻繁的身體活動可以降低患病幾率;是否頻繁飲酒、長時間使用技術(shù)設(shè)備每日飲水量等對肥胖水平有一定影響。

       因此,根據(jù)實驗結(jié)果,要想控制肥胖應(yīng)努力加強家庭可以采用的健康習(xí)慣,例如均衡白天的飲食、確定飲食時間、少吃高熱量的食物、降低飲酒頻率等;必須認(rèn)識到,除了飲食變化外,增加日常體育活動,例如每天至少步行半小時,每天至少喝兩升水,是必不可少的,因為沒有不鍛煉的飲食;對卡路里消耗進行規(guī)律檢測,減少使用技術(shù)設(shè)備的時間等。兒童和成人的高肥胖率是導(dǎo)致總體肥胖率較高的原因,我們再也不能對此視而不見,應(yīng)在生命早期階段就進行預(yù)防和控制,這樣才能可持續(xù)的解決肥胖問題,而我們每一個人也應(yīng)該提高認(rèn)識,養(yǎng)成健康的生活習(xí)慣。

       隨著云計算、物聯(lián)網(wǎng)和移動互聯(lián)網(wǎng)等技術(shù)的飛速發(fā)展,數(shù)據(jù)的類型和規(guī)模以前所未有的速度增長,而人工智能和數(shù)據(jù)挖掘的快速發(fā)展提高了數(shù)據(jù)管理效率。通過本實驗對實際案例的研究與學(xué)習(xí),對數(shù)據(jù)挖掘有關(guān)的知識有了初步的了解,為以后繼續(xù)學(xué)習(xí)數(shù)據(jù)挖掘與分析奠定了基礎(chǔ)。

       因為對數(shù)據(jù)挖掘不夠了解,實驗過程中遇到了很多問題。實驗仍存在很多問題,如實驗結(jié)果與實際情況存在偏差,模型準(zhǔn)確率有待提高;算法的很多代碼不夠完善,存在漏洞;對實驗結(jié)果分析不夠深入,有待進一步挖掘等等。針對這些不足,在今后不斷學(xué)習(xí)過程中會不斷完善。

相關(guān)知識

森林如何“治愈”人類?記者探訪國內(nèi)首個森林療養(yǎng)基地
自然的療愈力:河流與森林何以有益于人類健康?
關(guān)于發(fā)展森林康養(yǎng)產(chǎn)業(yè)與中青年心理療愈結(jié)合必要性研究
森林康復(fù)與康養(yǎng)旅游
森林康養(yǎng)與綠色健康
森林療愈:大自然的綠色奇跡
森林療養(yǎng)與人群健康
自然療愈與森林公園生態(tài)旅游.docx
短期森林療養(yǎng)活動對年輕健康個體部分身心健康指標(biāo)的影響
胖也要分類?人工智能+肥胖癥=肥胖癥的AIM分型

網(wǎng)址: 基于sklearn隨機森林算法探究肥胖的成因(二) http://www.u1s5d6.cn/newsview120637.html

推薦資訊