You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:52:48