睡眠健康数据分析(下)

简介: 睡眠健康数据分析

模型构建。

这里,我们将删除不会在模型中使用的Person ID变量。

df = df.drop('Person ID', axis = 1)
hot = pd.get_dummies(df[['Gender', 'Occupation', 'BMI Category', 'Blood Pressure']])
df = pd.concat([df, hot], axis = 1)
df = df.drop(['Gender', 'Occupation', 'BMI Category', 'Blood Pressure'], axis = 1)
X = df.drop('Sleep Disorder', axis = 1)
X = X.values
y = df['Sleep Disorder']

标准缩放器

在这里,我们将使用StandardSccaler将我们的数据放在相同的比例中

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_standard = scaler.fit_transform(X)

将数据转换为训练e测试,这里我们将使用30%的数据来测试机器学习模型。

from sklearn.model_selection import train_test_split
X_train,X_test, y_train, y_test = train_test_split(X_standard, y, test_size = 0.3, random_state = 0)

朴素贝叶斯

运行高斯模型。

这里我们将使用朴素贝叶斯模型,我们将使用我们的正态数据测试高斯模型。

在我们的第一个模型中,我们有一个非常差的结果,只有53%的准确率,虽然它只能很好地预测有问题的人,但它在预测没有问题的人时结果很差。

from sklearn.naive_bayes import GaussianNB
naive_bayes = GaussianNB()
naive_bayes.fit(X_train, y_train)
previsoes = naive_bayes.predict(X_test)
cm = ConfusionMatrix(naive_bayes)
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

score_naive_gaussian = 0.530973451327433

决策图表

这里我们将使用决策树模型,我们将测试熵和基尼系数的计算。

在这里,我们应用GridSearch来检查哪些是可以使用的最佳指标。

parameters = {'max_depth': [3, 4, 5, 6, 7, 9, 11],
              'min_samples_split': [2, 3, 4, 5, 6, 7],
              'criterion': ['entropy', 'gini']
             }
model = DecisionTreeClassifier()
gridDecisionTree = RandomizedSearchCV(model, parameters, cv = 3, n_jobs = -1)
gridDecisionTree.fit(X_train, y_train)
print('Mín Split: ', gridDecisionTree.best_estimator_.min_samples_split)
print('Max Nvl: ', gridDecisionTree.best_estimator_.max_depth)
print('Algorithm: ', gridDecisionTree.best_estimator_.criterion)
print('Score: ', gridDecisionTree.best_score_)

运行决策树。

现在,在我们的决策树模型中,与朴素贝叶斯相比,我们有了非常大的改进,我们有89.38%的准确性,该模型能够很好地预测3个类别。

score_tree = 0.8938053097345132
columns = df.drop('Sleep Disorder', axis = 1).columns
feature_imp = pd.Series(decision_tree.feature_importances_, index = columns).sort_values(ascending = False)
feature_imp

BMI Category_Normal 0.450011

Physical Activity Level 0.227875

Age 0.109282

BMI Category_Normal Weight 0.090082

Sleep Duration 0.041911

Stress Level 0.038346

Blood Pressure_142/92 0.017656

Occupation_Teacher 0.013466

Occupation_Lawyer 0.005720

Occupation_Engineer 0.002862

Quality of Sleep 0.002789

Gender_Female 0.000000

Blood Pressure_130/85 0.000000

Blood Pressure_122/80 0.000000

Blood Pressure_125/80 0.000000

Blood Pressure_125/82 0.000000

Blood Pressure_126/83 0.000000

Blood Pressure_128/84 0.000000

Blood Pressure_128/85 0.000000

Blood Pressure_129/84 0.000000

Blood Pressure_130/86 0.000000

Blood Pressure_120/80 0.000000

Blood Pressure_131/86 0.000000

Blood Pressure_132/87 0.000000

Blood Pressure_135/88 0.000000

Blood Pressure_135/90 0.000000

Blood Pressure_139/91 0.000000

Blood Pressure_140/90 0.000000

Blood Pressure_140/95 0.000000

Blood Pressure_121/79 0.000000

Blood Pressure_118/76 0.000000

Blood Pressure_119/77 0.000000

Gender_Male 0.000000

Occupation_Accountant 0.000000

Occupation_Doctor 0.000000

Occupation_Manager 0.000000

Occupation_Nurse 0.000000

Occupation_Sales Representative 0.000000

Occupation_Salesperson 0.000000

Occupation_Scientist 0.000000

Occupation_Software Engineer 0.000000

Daily Steps 0.000000

Heart Rate 0.000000

BMI Category_Obese 0.000000

BMI Category_Overweight 0.000000

Blood Pressure_115/78 0.000000

Blood Pressure_117/76 0.000000

Blood Pressure_118/75 0.000000

Blood Pressure_115/75 0.000000

dtype: float64

随机森林

这里我们将使用随机森林模型,我们将测试熵和基尼系数的计算。

应用网格搜索

搜索

from sklearn.ensemble import RandomForestClassifier
parameters = {'max_depth': [3, 4, 5, 6, 7, 9, 11],
              'min_samples_split': [2, 3, 4, 5, 6, 7],
              'criterion': ['entropy', 'gini']
             }
model = RandomForestClassifier()
gridRandomForest = RandomizedSearchCV(model, parameters, cv = 5, n_jobs = -1)
gridRandomForest.fit(X_train, y_train)
print('Algorithm: ', gridRandomForest.best_estimator_.criterion)
print('Score: ', gridRandomForest.best_score_)
print('Mín Split: ', gridRandomForest.best_estimator_.min_samples_split)
print('Max Nvl: ', gridRandomForest.best_estimator_.max_depth)

运行随机森林。

在这里,在随机森林模型中,我们设法提高了更多,我们获得了90.26%的准确性。

random_forest = RandomForestClassifier(n_estimators = 100, min_samples_split = 5, max_depth= 5,  criterion = 'gini', random_state = 0)
random_forest.fit(X_train, y_train)
previsoes = random_forest.predict(X_test)
cm = ConfusionMatrix(random_forest)
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

score_random = 0.9026548672566371

检查模型中最重要的变量

feature_imp_random = pd.Series(random_forest.feature_importances_, index = columns).sort_values(ascending = False)
feature_imp_random

MI Category_Normal 0.131351

BMI Category_Overweight 0.130821

Blood Pressure_140/95 0.092496

Age 0.086894

Sleep Duration 0.073755

Occupation_Nurse 0.060407

Physical Activity Level 0.055393

Heart Rate 0.049097

Daily Steps 0.048757

Stress Level 0.041599

Quality of Sleep 0.030586

Occupation_Salesperson 0.026217

Blood Pressure_135/90 0.025475

Blood Pressure_130/85 0.020394

Gender_Male 0.015391

Blood Pressure_125/80 0.014591

Occupation_Doctor 0.013854

Occupation_Engineer 0.012983

Occupation_Teacher 0.012427

Gender_Female 0.011748

BMI Category_Normal Weight 0.008467

BMI Category_Obese 0.006766

Blood Pressure_120/80 0.005265

Occupation_Accountant 0.003363

Occupation_Lawyer 0.002648

Blood Pressure_132/87 0.002587

Occupation_Sales Representative 0.002245

Blood Pressure_130/86 0.001697

Blood Pressure_128/85 0.001614

Blood Pressure_128/84 0.001585

Blood Pressure_142/92 0.001332

Blood Pressure_131/86 0.001149

Blood Pressure_139/91 0.000985

Blood Pressure_129/84 0.000805

Blood Pressure_140/90 0.000802

Blood Pressure_135/88 0.000744

Blood Pressure_126/83 0.000704

Blood Pressure_118/75 0.000622

Occupation_Software Engineer 0.000531

Blood Pressure_115/75 0.000520

Occupation_Scientist 0.000515

Blood Pressure_121/79 0.000504

Blood Pressure_117/76 0.000260

Blood Pressure_115/78 0.000051

Blood Pressure_119/77 0.000001

Blood Pressure_122/80 0.000000

Blood Pressure_118/76 0.000000

Blood Pressure_125/82 0.000000

Occupation_Manager 0.000000

dtype: float64


额外的树

这里我们将使用额外的树模型,我们将测试熵和基尼系数的计算。

应用网格搜索

from sklearn.ensemble import ExtraTreesClassifier
parameters = {'max_depth': [3, 4, 5, 6, 7, 9, 11],
              'min_samples_split': [2, 3, 4, 5, 6, 7],
              'criterion': ['entropy', 'gini']
             }
model = ExtraTreesClassifier()
gridExtraTrees = RandomizedSearchCV(model, parameters, cv = 3, n_jobs = -1)
gridExtraTrees.fit(X_train, y_train)
print('Algorithm: ', gridExtraTrees.best_estimator_.criterion)
print('Score: ', gridExtraTrees.best_score_)
print('Mín Split: ', gridExtraTrees.best_estimator_.min_samples_split)
print('Max Nvl: ', gridExtraTrees.best_estimator_.max_depth)

score_extra = 0.8849557522123894
• 1

kNN

这里我们将使用K-Neighbors模型,我们将使用GridSearch模型来找出在该模型中使用的最佳指标。

在这里,我们将使用GridSearch来找出在该模型中使用的最佳指标。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
k_list = list(range(1,10))
k_values = dict(n_neighbors = k_list)
grid = GridSearchCV(knn, k_values, cv = 2, scoring = 'accuracy', n_jobs = -1)
grid.fit(X_train, y_train)
grid.best_params_, grid.best_score_

运行K-Neighbors。

虽然我们的结果稍差,但它仍然是一个很好的模型,准确率为88.49%。

knn = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
knn.fit(X_train, y_train)
previsoes = knn.predict(X_test)
cm = ConfusionMatrix(knn)
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

score_knn = 0.8849557522123894

逻辑回归

这里我们将使用线性回归模型。

我们设法得到了一个更好的结果,在逻辑回归模型中,我们有91.11%的准确率。

from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression(random_state = 1, max_iter=10000)
logistic.fit(X_train, y_train)
previsoes = logistic.predict(X_test)
cm = ConfusionMatrix(logistic)
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

logistic_normal = 0.911504424778761

adaboost算法

这里我们将使用AdaBoost模型,我们将使用GridSearch模型来找出在该模型中使用的最佳指标。

应用网格搜索

from sklearn.ensemble import AdaBoostClassifier
parameters = {'learning_rate': [0.01, 0.02, 0.05, 0.07, 0.09, 0.1, 0.3, 0.001, 0.005],
              'n_estimators': [300, 500]
             }
model = AdaBoostClassifier()
gridAdaBoost = RandomizedSearchCV(model, parameters, cv = 2, n_jobs = -1)
gridAdaBoost.fit(X_train, y_train)
print('Learning Rate: ', gridAdaBoost.best_estimator_.learning_rate)
print('Score: ', gridAdaBoost.best_score_)

运行Ada Boost。

这里,在AdaBoost模型中,我们设法保持与模型相同的质量,准确率为91.15%。

ada_boost = AdaBoostClassifier(n_estimators = 500, learning_rate =  0.02, random_state = 0)
ada_boost.fit(X_train, y_train)
previsoes = ada_boost.predict(X_test)
cm = ConfusionMatrix(ada_boost)
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

score_ada_scaler = 0.911504424778761

结论

我们的数据不是很多,,我们的样本总共只有13列374个数据,另一件使我们的工作更容易的事情是,我们没有空值,所以我们不需要执行处理。

当进行数据分析时,我们可以看到我们的数据之间有很多相关性,但由于我们几乎没有可用的数据,所以没有删除这些数据,当我们具体查看我们的分类变量时,我们可以看到我们的数据在性别变量方面很平衡, 当我们查看我们的目标变量时,我们可以看到我们的大部分数据没有睡眠问题,那些有睡眠问题的数据在两个类别之间很好地平衡(睡眠呼吸暂停和失眠),当我们查看连续变量时,我们没有发现它们之间的模式,查看箱线图时,我发现没有必要处理异常值,数据分布良好。

当我们观察双变量分析比较我们的目标变量和我们的解释数据时,我们已经得出了一些结论,女性更有可能有睡眠问题,当我们看身体质量指数变量时,我们可以看到正常体重的人通常没有问题,超重的人通常更有可能有睡眠问题。 当我们看可变职业时,有趣的是看到一些职业比其他职业更容易有睡眠问题,另一个引起我注意的变量是年龄变量,老年人更容易有睡眠问题。

相关文章
|
8月前
|
数据挖掘 数据库
睡眠健康数据分析(上)
睡眠健康数据分析
232 0
|
5天前
|
机器学习/深度学习 数据可视化 数据挖掘
用Python进行健康数据分析:挖掘医疗统计中的信息
【4月更文挑战第12天】Python在医疗健康数据分析中扮演重要角色,具备数据处理、机器学习、可视化及丰富生态的优势。基本流程包括数据获取、预处理、探索、模型选择与训练、评估优化及结果可视化。应用案例包括疾病预测、药物效果分析和医疗资源优化,例如使用RandomForestClassifier进行疾病预测,Logit模型分析药物效果,以及linprog优化医疗资源配置。
|
存储 弹性计算 分布式计算
【云栖号案例 | 医疗健康】华大基因数据上云,实现数据分析效率提高数千倍!
华大基因通过阿里云设计海量存储计算与数据安全等云平台架构,保障云上业务搭建与运转,实现了22小时内达成千人基因组分析的人类梦想。
|
新零售 大数据 数据挖掘
【健康医疗】4步完成数据分析报表,让医疗数据转化为生产力
阿里云大健康解决方案11套业务架构,6大技术架构覆盖医药食品、医院诊所、2o2B、移动医疗等业务,让医疗服务行云流水。4步完成数据分析报表,让医疗数据转化为生产力。
2309 0
|
5天前
|
机器学习/深度学习 数据采集 算法
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
|
3天前
|
机器学习/深度学习 数据挖掘 Python
Python数据分析 | 泰坦尼克逻辑回归(下)
Python数据分析 | 泰坦尼克逻辑回归
7 1
|
3天前
|
机器学习/深度学习 数据挖掘 BI
Python数据分析 | 泰坦尼克逻辑回归(上)
Python数据分析 | 泰坦尼克逻辑回归
15 0
|
3天前
|
数据采集 数据挖掘 Python
Python数据分析 | 线性回归
Python数据分析 | 线性回归
11 1
|
3天前
|
数据采集 人工智能 数据挖掘
「一行分析」利用12000条招聘数据分析Python学习方向和就业方向
「一行分析」利用12000条招聘数据分析Python学习方向和就业方向
|
5天前
|
数据采集 数据可视化 数据挖掘
利用Python和Pandas库优化数据分析流程
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要依据。Python作为一种强大且易于上手的编程语言,配合Pandas这一功能丰富的数据处理库,极大地简化了数据分析的流程。本文将探讨如何利用Python和Pandas库进行高效的数据清洗、转换、聚合以及可视化,从而优化数据分析的流程,提高数据分析的效率和准确性。