温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 🙂
1. 项目简介
Sleep Cycle(SC;NorthCube,Gothenburg,Sweden)是一款可在基于android和iOS设备上使用的移动电话应用程序。SC是一个智能闹钟,它可以跟踪你的睡眠模式,并在浅睡眠中唤醒你。SC会跟踪整晚的睡眠情况,并使用30分钟的窗口,在这个窗口中,警报会在最轻的阶段(即浅睡眠)结束,达到所需的警报时间。SC通过两种运动检测模式中的一种来进行睡眠运动检测:(i)使用内置麦克风分析运动的麦克风,或(ii)使用手机内置加速计的加速计。
本项目利用 pandas + Matplotlib + seaborn + sklearn 等工具包,对睡眠数据进行探索式可视化分析,并构建 KNN、LR、决策树、随机森林等算法实现对睡眠质量的预测建模。
2. 功能组成
基于python个人睡眠质量分析建模的功能主要包括:
3. 数据读取和预处理
本项目采用 SC提供的数据,并通过iOS上的Northcube的Sleep Cycle应用程序收集。
Start-开始睡眠时间
End-结束睡眠时间
Sleep quality-睡眠质量
Time in bed-躺在床上的时间
Wake up-醒来状态
Sleep Notes-睡眠笔记
Heart rate-睡眠心率
Activity (steps)-活动(步骤)
缺失值分析,检查整个数据集中的空部分,红色部分缺少数据:
“Wake up”、“Sleep Notes”和“Heart rate”功能中缺少数据。我们可以注意到“卧床时间”的特征是从“开始”和“结束”两个方面来计算的。正如我们所知,睡眠质量不仅取决于睡眠的持续时间“在床上的时间”,还取决于你睡眠的“开始”时刻。
- df['Start time'] = pd.Series([val.time() for val in df['Start']])
- df['End time'] = pd.Series([val.time() for val in df['End']])
- df['Start time in second'] = df['Start time'].apply(lambda x: (x.hour*60+x.minute)*60 + x.second)
- df['End time in second'] = df['End time'].apply(lambda x: (x.hour*60+x.minute)*60 + x.second)
4. 数据探索式可视化分析
4.1 非空特征间的相关性
- # 相关性的可视化
- fig = plt.figure(figsize = (12,10))
- r = sns.heatmap(df.corr(),cmap='Oranges')
- r.set_title('Correlation')
检查特征与“睡眠质量”的相关性:
df.corr()['Sleep quality'].sort_values(ascending = False)
- Sleep quality 1.000000
- Time in bed 0.695206
- Start time in second 0.234936
- End time in second 0.076523
- Heart rate -0.037846
- Activity (steps) -0.190491
很明显,“卧床时间”与“睡眠质量”的关系最大,除了它本身。睡眠时间的“开始时间”与“结束时间”的关系更大。
4.2 全局特征 pairplot
4.3 “睡眠质量”和“卧床时间”与单位秒的联合绘图
4.4 开始睡眠和结束睡眠时间的柱状图
4.5 步数 Steps 的分布柱状图
从上面的柱状图来看,“步数”不是睡眠时的“步数”,而是白天的“步数”,代表白天的活动。
4.6 “睡眠质量”和“活动性”特征与秒级别单位的联合图。
- # 特征与睡眠质量"sleep quality" 的相关性
- df_new.corr()['Sleep quality'].sort_values(ascending = False)
-
- # Scatter plot
- plt.figure(figsize=(10,6))
- plt.scatter(df_new['Sleep quality'],df_new['Activity (steps)'], c="g", alpha=0.5, marker=r'$\clubsuit$',
- label="Sleep quality vs. Steps")
- plt.xlabel("Sleep quality")
- plt.ylabel("Steps during the day")
- plt.legend(loc='upper left')
- plt.show()
如果我们只看“睡眠质量”和“步数 step ”之间的相关性,它们就没有那么大的关系了。根据经验,人们普遍认为,白天大量活动可以改善睡眠质量。然而,我们在这里没有看到这种关系。
5. 机器学习建模 Machine Learning
5.1 训练集和测试集划分
- X = df[['Time in bed', 'Start time in second','End time in second','Activity (steps)']].values
- y = df['Sleep quality'].values
- from sklearn.model_selection import train_test_split
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
- # In order to normalize the features, it is better to use MinMaxScaler
- from sklearn.preprocessing import MinMaxScaler
- scaler = MinMaxScaler()
- scaler.fit(X_train)
- X_train = scaler.transform(X_train)
- X_test = scaler.transform(X_test)
5.2 LinearRegression Model
- from sklearn.linear_model import LinearRegression
- lm = LinearRegression()
- lm.fit(X_train,y_train)
- lm.score(X_test,y_test)
-
- print('test accuracy:', lm.score(X_test,y_test))
5.3 KNN (K nearest neighbors) model
- from sklearn.neighbors import KNeighborsClassifier
-
- error_rate =[]
- for i in range(1,20):
- knn = KNeighborsClassifier(n_neighbors=i)
- knn.fit(X_train,y_train)
- pred_i = knn.predict(X_test)
- error_rate.append(np.mean(pred_i != y_test))
-
- plt.figure(figsize=(10,6))
- plt.plot(range(1,20),error_rate, color ='red',linestyle='dashed',marker='v',
- markerfacecolor = 'blue', markersize=10)
- plt.title('Error Rate vs. K value')
- plt.xlabel('K')
- plt.ylabel('Error Rate')
同理构建Logistic Regression Model、Decision Tree Model、Random Forest Model 、Support Machine Vector (SVM) Algorithm等机器学习模型,受篇幅限制,此处省略。
对多个模型的预测结果进行对比:
- Linear Regresion Model precision: 0.41236039548039705
- KNN Model precision: 0.06741573033707865
- Logistic Regression Model precision: 0.03932584269662921
- Decision Tree Model precision: 0.05056179775280899
- Random Tree Model precision: 0.03932584269662921
- Support Machine Vector precision: 0.033707865168539325
6. 总结
本项目利用 pandas + Matplotlib + seaborn + sklearn 等工具包,对睡眠数据进行探索式可视化分析,并构建 KNN、LR、决策树、随机森林等算法实现对睡眠质量的预测建模。
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。
技术交流认准下方 CSDN 官方提供的学长 QQ 名片 🙂
精彩专栏推荐订阅:
Python 毕设精品实战案例