PAMAP2数据集心率预测模型选型及代码错误排查
解决PAMAP2数据集心率预测的代码错误与完整方案
一、先搞定你的代码报错
你遇到的AttributeError是个典型的低级错误——subject1已经是一个DataFrame对象了,不需要再调用.DataFrame()方法!这就好比你已经拿着一杯奶茶,还非要对着它喊“给我做一杯奶茶”,系统当然会懵圈😂。
另外你写的data.target也不对,直接从DataFrame里取列就行。修正后的基础线性回归代码如下:
import pandas as pd from sklearn.linear_model import LinearRegression # 假设subject1是你的完整数据集DataFrame # 提取目标变量:心率 y = subject1["heart_rate"] # 提取特征:排除目标列和暂时不用的timestamp(后续可以考虑采样后加入) X = subject1.drop(["heart_rate", "timestamp"], axis=1) # 初始化并训练线性回归模型 lm = LinearRegression() model = lm.fit(X, y) predictions = lm.predict(X) # 打印前5个预测值 print(predictions[:5])
二、针对PAMAP2数据集的完整分析方案
你提到了时间采样、多种模型意向,咱们一步步来优化:
1. 数据预处理:按时间间隔采样
因为你的timestamp是毫秒级,高频数据容易引入噪声,按2-5秒采样会让模型更稳定。这里以3秒为例,用均值聚合采样:
# 把timestamp转换成datetime类型(单位毫秒) subject1['timestamp'] = pd.to_datetime(subject1['timestamp'], unit='ms') # 设置timestamp为索引,方便重采样 subject1 = subject1.set_index('timestamp') # 按3秒间隔采样,取各特征的均值(适合数值型数据) sampled_df = subject1.resample('3S').mean().dropna() # 拆分采样后的特征和目标 y_sampled = sampled_df["heart_rate"] X_sampled = sampled_df.drop("heart_rate", axis=1)
2. 模型实现与对比
你意向的几个模型,这里分别给出落地代码:
(1)多元线性回归
其实你最初想的Linear Regression就是多元线性回归(当特征数量>1时),用采样后的数据训练并评估:
from sklearn.metrics import mean_squared_error, r2_score lm = LinearRegression() lm.fit(X_sampled, y_sampled) y_pred = lm.predict(X_sampled) # 输出模型评估指标 print(f"多元线性回归 - MSE: {mean_squared_error(y_sampled, y_pred):.2f}") print(f"多元线性回归 - R²: {r2_score(y_sampled, y_pred):.2f}")
(2)多项式回归
如果线性模型拟合效果不好,可以试试多项式回归,通过引入特征的高阶项提升拟合能力:
from sklearn.preprocessing import PolynomialFeatures # 选择2次多项式(次数太高容易过拟合,先从2次试起) poly = PolynomialFeatures(degree=2) X_poly = poly.fit_transform(X_sampled) # 训练多项式回归模型 poly_lm = LinearRegression() poly_lm.fit(X_poly, y_sampled) y_poly_pred = poly_lm.predict(X_poly) print(f"多项式回归(2次) - MSE: {mean_squared_error(y_sampled, y_poly_pred):.2f}") print(f"多项式回归(2次) - R²: {r2_score(y_sampled, y_poly_pred):.2f}")
(3)聚类+回归组合方案
聚类模型(KMeans、层次聚类)是无监督模型,不能直接预测心率,但可以先把数据分成不同簇(比如不同活动强度的簇),再把簇标签作为特征加入回归模型,提升预测效果:
KMeans聚类+回归
from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 聚类对特征尺度敏感,先标准化特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X_sampled) # 初始化KMeans,设3个簇(可以用肘部法则选最优簇数) kmeans = KMeans(n_clusters=3, random_state=42) sampled_df['kmeans_cluster'] = kmeans.fit_predict(X_scaled) # 把簇标签作为新特征,训练回归模型 X_with_kmeans = sampled_df.drop("heart_rate", axis=1) y_kmeans = sampled_df["heart_rate"] lm_kmeans = LinearRegression() lm_kmeans.fit(X_with_kmeans, y_kmeans) y_kmeans_pred = lm_kmeans.predict(X_with_kmeans) print(f"KMeans簇+回归 - MSE: {mean_squared_error(y_kmeans, y_kmeans_pred):.2f}") print(f"KMeans簇+回归 - R²: {r2_score(y_kmeans, y_kmeans_pred):.2f}")
层次聚类(Agglomerative Clustering)+回归
from sklearn.cluster import AgglomerativeClustering # 初始化层次聚类,设3个簇 agg_cluster = AgglomerativeClustering(n_clusters=3) sampled_df['agg_cluster'] = agg_cluster.fit_predict(X_scaled) # 加入簇标签训练回归 X_with_agg = sampled_df.drop("heart_rate", axis=1) y_agg = sampled_df["heart_rate"] lm_agg = LinearRegression() lm_agg.fit(X_with_agg, y_agg) y_agg_pred = lm_agg.predict(X_with_agg) print(f"层次簇+回归 - MSE: {mean_squared_error(y_agg, y_agg_pred):.2f}") print(f"层次簇+回归 - R²: {r2_score(y_agg, y_agg_pred):.2f}")
3. 关键优化建议
- 划分训练/测试集:一定要用部分数据训练,另一部分测试,避免过拟合。代码示例:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_sampled, y_sampled, test_size=0.2, random_state=42) # 用训练集训练,测试集评估 lm.fit(X_train, y_train) y_test_pred = lm.predict(X_test) print(f"测试集MSE: {mean_squared_error(y_test, y_test_pred):.2f}")
- 特征选择:34个特征里可能有冗余,用相关性分析或
SelectKBest筛选和心率相关性高的特征,能有效提升模型效率。
内容的提问来源于stack exchange,提问作者Zaid
相关产品推荐
相关产品推荐

