睡眠健康数据分析(下)

简介: 睡眠健康数据分析

模型构建。

这里,我们将删除不会在模型中使用的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个数据,另一件使我们的工作更容易的事情是,我们没有空值,所以我们不需要执行处理。

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

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

相关文章
|
10月前
|
数据挖掘 数据库
睡眠健康数据分析(上)
睡眠健康数据分析
305 0
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
用Python进行健康数据分析:挖掘医疗统计中的信息
【4月更文挑战第12天】Python在医疗健康数据分析中扮演重要角色,具备数据处理、机器学习、可视化及丰富生态的优势。基本流程包括数据获取、预处理、探索、模型选择与训练、评估优化及结果可视化。应用案例包括疾病预测、药物效果分析和医疗资源优化,例如使用RandomForestClassifier进行疾病预测,Logit模型分析药物效果,以及linprog优化医疗资源配置。
|
存储 弹性计算 分布式计算
【云栖号案例 | 医疗健康】华大基因数据上云,实现数据分析效率提高数千倍!
华大基因通过阿里云设计海量存储计算与数据安全等云平台架构,保障云上业务搭建与运转,实现了22小时内达成千人基因组分析的人类梦想。
|
新零售 大数据 数据挖掘
【健康医疗】4步完成数据分析报表,让医疗数据转化为生产力
阿里云大健康解决方案11套业务架构,6大技术架构覆盖医药食品、医院诊所、2o2B、移动医疗等业务,让医疗服务行云流水。4步完成数据分析报表,让医疗数据转化为生产力。
2314 0
|
5天前
|
机器学习/深度学习 监控 算法
Python数据分析与机器学习在金融风控中的应用
Python数据分析与机器学习在金融风控中的应用
31 12
|
3天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
【7月更文挑战第12天】Python的Pandas和NumPy库助力高效数据处理。Pandas用于数据清洗,如填充缺失值和转换类型;NumPy则擅长数组运算,如元素级加法和矩阵乘法。结合两者,可做复杂数据分析和特征工程,如产品平均销售额计算及销售额标准化。Pandas的时间序列功能,如移动平均计算,进一步增强分析能力。掌握这两者高级技巧,能提升数据分析质量和效率。
16 4
|
3天前
|
机器学习/深度学习 存储 数据可视化
这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
微软在 UserVoice 上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展,但在 2020 年年末,Python 之⽗ Guido van Rossum 发布推⽂称“退休太无聊了”,他将会加入微软。此事令 Excel ⽤户重燃希望。我不知道他的举动是否影响了 Excel 和 Python 的集成,但我清楚的是,为何⼈们迫切需要结合 Excel 和 Python 的⼒量,⽽你⼜应当如何从今天开始将两者结合起来。总之,这就是本
|
6天前
|
数据采集 机器学习/深度学习 数据挖掘
Python基于波动率模型(ARCH和GARCH)进行股票数据分析项目实战
Python基于波动率模型(ARCH和GARCH)进行股票数据分析项目实战
|
7天前
|
机器学习/深度学习 数据采集 搜索推荐
Python数据分析与机器学习在电子商务推荐系统中的应用
Python数据分析与机器学习在电子商务推荐系统中的应用
24 5
|
6天前
|
机器学习/深度学习 存储 数据可视化
这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
微软在 UserVoice 上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展,但在 2020 年年末,Python 之⽗ Guido van Rossum 发布推⽂称“退休太无聊了”,他将会加入微软。此事令 Excel ⽤户重燃希望。我不知道他的举动是否影响了 Excel 和 Python 的集成,但我清楚的是,为何⼈们迫切需要结合 Excel 和 Python 的⼒量,⽽你⼜应当如何从今天开始将两者结合起来。总之,这就是本