视频游戏销量线性回归R²接近零:非数值特征编码问题求助
视频游戏销量线性回归分析遇挫:R²接近0的问题
我正在做视频游戏销量的研究,想用线性回归建模,但自变量都是非数值类型(Publisher、Platform、Genre),试了LabelEncoder后效果极差,R²系数几乎为0。
我的代码
vg = video_games.copy() vg.head() LE = LabelEncoder() feature = ["Platform", "Genre", "Publisher"] for col in feature: vg[col] = LE.fit_transform(video_games[col]) print(vg.shape) data = pd.get_dummies(data=vg, columns=['Platform', 'Genre', 'Publisher']) print(data.shape) IndepVar_train, IndepVar_test, DepVar_train, DepVar_test = train_test_split(IndepVar, DepVar, test_size=.2, random_state=42) IndepVar_train.shape, DepVar_train.shape, IndepVar_test.shape, DepVar_test.shape lr = LinearRegression() lr.fit(IndepVar_train, DepVar_train) pred = lr.predict(IndepVar_test) r2_Result = r2_score(DepVar_test,pred) print(r2_Result) print(lr.score(IndepVar_test, DepVar_test))
运行结果
0.001819941354928023 0.001819941354928023
问题根源与解决办法
你犯了两个关键错误
- 重复编码:先给类别变量做LabelEncoder数值编码,接着又用get_dummies做独热编码,这会让特征完全混乱,模型根本学不到有效信息。
- LabelEncoder用错场景:LabelEncoder给类别分配0、1、2这类顺序值,但线性回归会默认这些值有大小关系(比如把编码为0的平台当成比1的差),但实际上Platform、Genre这些类别是无顺序的,这直接误导了模型。
正确的编码步骤
直接对原始的非数值类别列做独热编码,跳过LabelEncoder:vg = video_games.copy() # 直接对原始类别列做独热编码,drop_first避免多重共线性 data = pd.get_dummies(data=vg, columns=['Platform', 'Genre', 'Publisher'], drop_first=True) # 替换成你实际的销量列名,比如'Global_Sales' IndepVar = data.drop('销量列名', axis=1) DepVar = data['销量列名'] # 拆分数据集 IndepVar_train, IndepVar_test, DepVar_train, DepVar_test = train_test_split(IndepVar, DepVar, test_size=.2, random_state=42) # 训练模型 lr = LinearRegression() lr.fit(IndepVar_train, DepVar_train) pred = lr.predict(IndepVar_test) print(r2_score(DepVar_test,pred)) print(lr.score(IndepVar_test, DepVar_test))额外优化点
- 如果Publisher数量特别多(比如几百个),独热编码会导致特征爆炸,试试目标编码:用每个Publisher对应的平均销量作为该类别的编码值,既保留信息又不会增加太多特征。
- 游戏销量通常是右偏分布,对销量做对数转换(
np.log1p(DepVar)),让分布更接近正态,能提升线性回归的效果。 - 考虑加入更多特征:比如发行年份、游戏评分等,单一的类别变量可能不足以解释销量波动。
内容的提问来源于stack exchange,提问作者Faraz
相关产品推荐
相关产品推荐

