VR应用数据集线性回归模型训练/测试准确率异常排查请求
VR应用数据线性回归模型R²分数异常问题排查
我使用2019-2021年VR应用领域调查数据(N为各领域应用数量,%为占总样本百分比)训练线性回归模型时,得到的R²分数极低甚至为负,代码步骤如下:
# 1. 导入库并读取CSV文件 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression df = pd.read_csv('VR_application.csv') # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(df[['year']], df[['N', '%']], test_size=0.2, random_state=42) # 3. 创建并训练线性回归模型 model = LinearRegression() model.fit(X_train, y_train) y_train_pred = model.predict(X_train) y_test_pred = model.predict(X_test) # 4. 计算准确率(R-squared分数) train_accuracy = r2_score(y_train, y_train_pred) test_accuracy = r2_score(y_test, y_test_pred) # 5. 输出结果 print(f"Train Accuracy: {train_accuracy}") print(f"Test Accuracy: {test_accuracy}")
运行结果:
Train Accuracy: 0.004421041085529986 Test Accuracy: -0.09666987166765573
问题根源
- 缺失必要导入:代码中使用
r2_score但未从sklearn.metrics导入,属于语法遗漏(能运行可能是环境预导入,但代码本身不完整)。 - 多目标回归逻辑错误:同时将
N和%作为目标变量,二者高度相关(百分比由数量计算得出),单特征year无法拟合两个冗余目标,导致模型无有效学习信号。 - 特征维度严重不足:仅用
year作为特征,而数据是「年份+领域」的二维分布,年份无法解释不同领域的应用数量/占比差异,特征完全无法覆盖数据规律。 - 数据结构理解偏差:数据集按领域和年份分组记录,应针对每个领域的时间趋势建模,或把领域作为分类特征加入模型,而非直接用年份拟合所有领域的聚合数据。
修正方案示例
方案1:按领域拆分,单独建模时间趋势
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score df = pd.read_csv('VR_application.csv') # 遍历每个领域,针对该领域的年度数量变化建模 for domain in df['领域'].unique(): domain_data = df[df['领域'] == domain] X = domain_data[['year']] y = domain_data['N'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LinearRegression() model.fit(X_train, y_train) train_r2 = r2_score(y_train, model.predict(X_train)) test_r2 = r2_score(y_test, model.predict(X_test)) print(f"领域:{domain}") print(f"训练集R²: {train_r2:.4f}") print(f"测试集R²: {test_r2:.4f}\n")
方案2:加入领域特征,构建多特征模型
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline df = pd.read_csv('VR_application.csv') # 用年份+领域作为特征,预测应用数量N X = df[['year', '领域']] y = df['N'] # 对分类特征「领域」做独热编码 preprocessor = ColumnTransformer( transformers=[('cat', OneHotEncoder(drop='first'), ['领域'])], remainder='passthrough' ) # 构建预处理+回归的管道 model = Pipeline(steps=[ ('preprocessor', preprocessor), ('regressor', LinearRegression()) ]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model.fit(X_train, y_train) train_r2 = r2_score(y_train, model.predict(X_train)) test_r2 = r2_score(y_test, model.predict(X_test)) print(f"训练集R²: {train_r2:.4f}") print(f"测试集R²: {test_r2:.4f}")
内容的提问来源于stack exchange,提问作者Abrar Hussain
相关产品推荐
相关产品推荐

