基于击杀事件的Dota2比赛胜负Logistic Regression建模数据处理问题
问题核心
你当前的错误根源是把单场比赛的多个击杀事件当成独立样本,且直接传入原始事件列表作为特征——Logistic Regression这类传统机器学习模型无法直接处理嵌套列表格式的特征,而且单场比赛的所有击杀事件属于同一样本(同一个matchId对应唯一的didRadiantWin标签),不能拆分训练。
数据整理正确方案:聚合单场比赛的击杀事件为统计特征
必须将每个matchId对应的所有击杀事件,转换成数值型统计特征,让每个matchId对应一行数据(一行即一个训练样本,包含特征和标签)。常用的统计维度示例如下:
import pandas as pd # 假设原始击杀数据为kill_events_df,结构和你提供的示例一致 kill_events_df = pd.DataFrame([ {'attacker': 22, 'gold': 317, 'target': 93, 'time': 2616, 'xp': 853, 'matchId': 7046446986, 'didRadiantWin': False}, {'attacker': 15, 'gold': 280, 'target': 88, 'time': 1800, 'xp': 720, 'matchId': 7046446986, 'didRadiantWin': False}, {'attacker': 93, 'gold': 350, 'target': 22, 'time': 3000, 'xp': 900, 'matchId': 7046446987, 'didRadiantWin': True} ]) # 标记攻击方/目标方阵营(根据Dota2实际英雄ID规则调整,示例中1-50为天辉,51-100为夜魇) kill_events_df['attacker_team'] = kill_events_df['attacker'].apply(lambda x: 'radiant' if x <= 50 else 'dire') kill_events_df['target_team'] = kill_events_df['target'].apply(lambda x: 'radiant' if x <= 50 else 'dire') # 按matchId聚合,生成统计特征 aggregated_df = kill_events_df.groupby('matchId').agg( # 标签取单场比赛的唯一值 didRadiantWin=('didRadiantWin', 'first'), # 天辉/夜魇击杀次数 radiant_kills=('attacker_team', lambda x: sum(x == 'radiant')), dire_kills=('attacker_team', lambda x: sum(x == 'dire')), # 天辉/夜魇总击杀金币 radiant_total_gold=('gold', lambda x: x[kill_events_df['attacker_team'] == 'radiant'].sum()), dire_total_gold=('gold', lambda x: x[kill_events_df['attacker_team'] == 'dire'].sum()), # 平均击杀时间、总击杀经验 avg_kill_time=('time', 'mean'), total_xp=('xp', 'sum') ).reset_index()
修正后的建模代码
聚合完成后,每个matchId对应一行标准样本,即可正常使用Logistic Regression训练:
from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn import metrics from sklearn.preprocessing import StandardScaler # 定义目标变量和特征集 y = aggregated_df['didRadiantWin'] X = aggregated_df.drop(['matchId', 'didRadiantWin'], axis=1) # Logistic Regression对特征尺度敏感,先标准化特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 拆分训练集和验证集 train_X, val_X, train_y, val_y = train_test_split(X_scaled, y, random_state=0, test_size=0.2) # 训练并评估模型 model = LogisticRegression(random_state=1) model.fit(train_X, train_y) preds = model.predict(val_X) print("模型准确率:", metrics.accuracy_score(val_y, preds))
额外优化建议
- 补充特征维度:比如击杀英雄的等级差(若有等级数据)、核心英雄击杀次数、击杀发生的游戏阶段(前期/中期/后期)等,可大幅提升模型效果
- 类别特征处理:若涉及英雄ID等类别特征,可使用独热编码或目标编码转换为数值型
- 不平衡数据处理:如果天辉/夜魇获胜样本比例失衡,可通过
class_weight='balanced'参数调整模型权重
内容的提问来源于stack exchange,提问作者Mvtj22
相关产品推荐
相关产品推荐

