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

基于击杀事件的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:07:41