基于sklearn隨機森林算法探究肥胖的成因(二)
2022-12-31 713 發(fā)布于黑龍江
版權
舉報
版權聲明:
本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權,亦不承擔相應法律責任。具體規(guī)則請查看《 阿里云開發(fā)者社區(qū)用戶服務協(xié)議》和 《阿里云開發(fā)者社區(qū)知識產(chǎn)權保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫 侵權投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權內(nèi)容。
實驗步驟
1.導入模塊與數(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'] #顯示中文標簽 plt.rcParams['axes.unicode_minus']=False # 導入數(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ù)、平均值、標準差、最大最小值、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ù)預處理
# 查看缺失值 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ù)沒有缺失值,不需要處理
# 查看重復值 any(data.duplicated())
data.duplicated()返回的是一堆布爾值,重復數(shù)據(jù)第一次出現(xiàn)為False,第二次以后均為True,故我們可以用any()函數(shù)來進行判斷,當數(shù)據(jù)只要有有一個重復值,則最終結果為True,否則為False。本次為True,說明數(shù)據(jù)存在重復值。需要處理
# 刪除重復行 data.drop_duplicates(inplace=True) data.shape
原始數(shù)據(jù)有2111行,刪除重復值還剩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ù)幾乎都有家庭肥胖歷史,說明家庭肥胖是可以遺傳給后代的。
特征相關性分析
#相關性 import seaborn as sns fig = plt.figure(figsize=(18,18)) sns.heatmap(data.corr(),vmax=1)
畫出熱力圖便于觀察個特征之間的相關性,顏色越深說明相關性越強
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)過值變換后的結果
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.構建模型
首先要劃分數(shù)據(jù)集
# 劃分訓練集和測試集 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.構建決策樹模型
# 決策樹 tree = DecisionTreeClassifier() tree.fit(x_train,y_train) y_pred = tree.predict(x_test) print('模型準確率',accuracy_score(y_test,y_pred)) print(confusion_matrix(y_test,y_pred))
模型準確率 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]]
我們可以看出決策樹模型的準確率為0.91,下面是它的混淆矩陣
2.構建隨機森林模型
# 訓練模型 rfc = RandomForestClassifier(n_estimators=1000) rfc.fit(x_train,y_train) y_pred = rfc.predict(x_test) print('模型準確率',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])
模型準確率 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
我們可以看出隨機森林模型的準確率為0.968,其中重要特征排名中,體重、身高、年齡、食用蔬菜的評率、性別、主餐次數(shù)等因素重要程度得分較高,說明重要程度越高。
3.構建GBDT模型
from sklearn.ensemble import GradientBoostingClassifier gbdt = GradientBoostingClassifier() gbdt.fit(x_train,y_train) y_pred = gbst.predict(x_test) print('模型準確率',accuracy_score(y_pred,y_test)) print(confusion_matrix(y_test,y_pred))
模型準確率 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]]
我們可以看出模型的準確率為0.96,準確率較高
綜上3種分類模型算法,隨機森林模型的準確率最高,我們建議用隨機森林來進行預測和探究肥胖的成因。
實驗總結
肥胖是一種全球性的疾病,無論人們的社會或文化水平如何,它始終都是熱點話題,而且全球患者的數(shù)量逐年增長。為了幫助對抗這種疾病,開發(fā)工具和解決方案去檢測或預測疾病的出現(xiàn)顯得非常重要,而數(shù)據(jù)挖掘是讓我們發(fā)現(xiàn)信息的重要工具。
本文使用隨機森林算法對數(shù)據(jù)集進行處理,通過對多個影響因子進行多標簽分類獲取各影響因子與肥胖水平之間的權值,由此建立肥胖評估模型,模型準確率達到96%,從而探究肥胖的成因。實驗結果表明了眾多影響因子與肥胖水平之間的關系,肥胖家族病史與肥胖水平之間強正相關,年齡以及是否經(jīng)常食用高熱量也與肥胖水平之間呈較強的正相關關系,也就是說,通常有肥胖家族病史的人患病可能性更大,年齡越大以及經(jīng)常食用高熱量食物的人更容易肥胖;是否進行卡路里消耗監(jiān)測以及是否經(jīng)?;顒由眢w等與肥胖水平有著負相關關系,換言之,規(guī)律的監(jiān)測卡路里消耗以及頻繁的身體活動可以降低患病幾率;是否頻繁飲酒、長時間使用技術設備每日飲水量等對肥胖水平有一定影響。
因此,根據(jù)實驗結果,要想控制肥胖應努力加強家庭可以采用的健康習慣,例如均衡白天的飲食、確定飲食時間、少吃高熱量的食物、降低飲酒頻率等;必須認識到,除了飲食變化外,增加日常體育活動,例如每天至少步行半小時,每天至少喝兩升水,是必不可少的,因為沒有不鍛煉的飲食;對卡路里消耗進行規(guī)律檢測,減少使用技術設備的時間等。兒童和成人的高肥胖率是導致總體肥胖率較高的原因,我們再也不能對此視而不見,應在生命早期階段就進行預防和控制,這樣才能可持續(xù)的解決肥胖問題,而我們每一個人也應該提高認識,養(yǎng)成健康的生活習慣。
隨著云計算、物聯(lián)網(wǎng)和移動互聯(lián)網(wǎng)等技術的飛速發(fā)展,數(shù)據(jù)的類型和規(guī)模以前所未有的速度增長,而人工智能和數(shù)據(jù)挖掘的快速發(fā)展提高了數(shù)據(jù)管理效率。通過本實驗對實際案例的研究與學習,對數(shù)據(jù)挖掘有關的知識有了初步的了解,為以后繼續(xù)學習數(shù)據(jù)挖掘與分析奠定了基礎。
因為對數(shù)據(jù)挖掘不夠了解,實驗過程中遇到了很多問題。實驗仍存在很多問題,如實驗結果與實際情況存在偏差,模型準確率有待提高;算法的很多代碼不夠完善,存在漏洞;對實驗結果分析不夠深入,有待進一步挖掘等等。針對這些不足,在今后不斷學習過程中會不斷完善。
相關知識
森林如何“治愈”人類?記者探訪國內(nèi)首個森林療養(yǎng)基地
自然的療愈力:河流與森林何以有益于人類健康?
關于發(fā)展森林康養(yǎng)產(chǎn)業(yè)與中青年心理療愈結合必要性研究
森林康復與康養(yǎng)旅游
森林康養(yǎng)與綠色健康
森林療愈:大自然的綠色奇跡
森林療養(yǎng)與人群健康
自然療愈與森林公園生態(tài)旅游.docx
短期森林療養(yǎng)活動對年輕健康個體部分身心健康指標的影響
胖也要分類?人工智能+肥胖癥=肥胖癥的AIM分型
網(wǎng)址: 基于sklearn隨機森林算法探究肥胖的成因(二) http://m.u1s5d6.cn/newsview120637.html
推薦資訊
- 1發(fā)朋友圈對老公徹底失望的心情 12775
- 2BMI體重指數(shù)計算公式是什么 11235
- 3補腎吃什么 補腎最佳食物推薦 11199
- 4性生活姿勢有哪些 盤點夫妻性 10425
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎代謝率(BMR)計算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7826