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

基于Keras实现特定选手对战胜负预测及特征优先级处理咨询

选手对战胜负预测解决方案

针对你的需求——预测特定选手对战(如Bob vs Nathan)的胜负,同时避免独热编码导致的庞大矩阵,以及优先处理重要变量,以下是具体解决方案:

一、高效的选手特征编码方案

1. 嵌入层(Embedding Layer)

这是处理类别型变量(如选手姓名)的最优方案之一:

  • 将每个选手姓名映射为低维稠密向量(通常8-16维),既不会生成稀疏庞大的矩阵,还能捕捉选手间的潜在对战模式
  • 核心步骤:
    1. 用LabelEncoder将选手姓名转为唯一整数索引
    2. 为Player1和Player2分别设置嵌入层,将索引转为向量
    3. 拼接嵌入向量与BMI、体温、体重等数值特征,输入全连接层训练

2. 目标编码(Target Encoding)

适合小数据集的轻量化方案:

  • 计算每个选手的历史胜率(比如作为Player1的胜率、作为Player2的胜率,或综合胜率)
  • 用胜率值替换原选手姓名列,既不会增加维度,还能直接引入选手对战能力的核心信息

二、优先处理重要变量的模型

1. 梯度提升树(XGBoost/LightGBM)

这类模型自带特征重要性计算机制,训练时会自动优先学习对结果影响最大的特征(如对手姓名):

  • LightGBM支持直接输入类别特征,无需提前编码
  • 训练后可直接查看特征重要性排序,明确哪些变量对预测起关键作用

2. 带注意力机制的神经网络

在Keras中可自定义注意力层,让模型自动为重要特征(如选手信息)分配更高权重,强化关键变量的影响

3. 特征选择+模型训练

先用sklearn的SelectKBest或RFECV筛选出Top N重要特征,再输入到神经网络或其他模型中训练,减少无效信息干扰

三、代码实现示例

示例1:Keras嵌入层多输入模型

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Embedding, Flatten, Concatenate, Input

# 读取数据集
df = pd.read_csv('new_winner.csv')
# 构建目标变量:Winner是Player1则为1,否则为0
df['Target'] = (df['Winner'] == df['Player1']).astype(int)

# 编码选手姓名
player_encoder = LabelEncoder()
all_players = pd.concat([df['Player1'], df['Player2']])
player_encoder.fit(all_players)
df['Player1_idx'] = player_encoder.transform(df['Player1'])
df['Player2_idx'] = player_encoder.transform(df['Player2'])
num_players = len(player_encoder.classes_)

# 提取数值特征
numeric_features = df[['BMI', 'Temperature', 'Weight']].values

# 构建多输入模型
player1_input = Input(shape=(1,), name='player1')
player2_input = Input(shape=(1,), name='player2')
numeric_input = Input(shape=(3,), name='numeric')

# 嵌入层处理选手特征
player1_emb = Embedding(num_players, 8, input_length=1)(player1_input)
player2_emb = Embedding(num_players, 8, input_length=1)(player2_input)
player1_flat = Flatten()(player1_emb)
player2_flat = Flatten()(player2_emb)

# 拼接所有特征
concat_features = Concatenate()([player1_flat, player2_flat, numeric_features])

# 全连接层
dense1 = Dense(12, activation='relu')(concat_features)
dense2 = Dense(8, activation='relu')(dense1)
output = Dense(1, activation='sigmoid')(dense2)

# 编译并训练模型
model = Model(inputs=[player1_input, player2_input, numeric_input], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(
    [df['Player1_idx'], df['Player2_idx'], numeric_features],
    df['Target'],
    epochs=100,
    batch_size=2
)

# 评估模型
_, accuracy = model.evaluate(
    [df['Player1_idx'], df['Player2_idx'], numeric_features],
    df['Target']
)
print(f'模型准确率: {accuracy * 100:.2f}%')

# 预测Bob vs Nathan的胜负
bob_idx = player_encoder.transform(['Bob'])[0]
nathan_idx = player_encoder.transform(['Nathan'])[0]
# 输入示例数值特征(可替换为真实数据)
pred_prob = model.predict([[bob_idx], [nathan_idx], [[25, 18, 40]]])[0][0]
print(f'Bob对阵Nathan的获胜概率: {pred_prob:.2f}')

示例2:LightGBM自动处理重要特征

import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 读取数据
df = pd.read_csv('new_winner.csv')
df['Target'] = (df['Winner'] == df['Player1']).astype(int)

# 将选手列设为类别特征
df['Player1'] = df['Player1'].astype('category')
df['Player2'] = df['Player2'].astype('category')

# 划分数据集
X = df[['BMI', 'Temperature', 'Weight', 'Player1', 'Player2']]
y = df['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train, categorical_feature=['Player1', 'Player2'])
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

# 设置模型参数
params = {
    'objective': 'binary',
    'metric': 'accuracy',
    'boosting_type': 'gbdt',
    'num_leaves': 31,
    'learning_rate': 0.05,
}

# 训练模型
model = lgb.train(params, train_data, num_boost_round=100, valid_sets=[test_data])

# 查看特征重要性
print('特征重要性排序:')
for name, importance in sorted(zip(X.columns, model.feature_importance()), key=lambda x: x[1], reverse=True):
    print(f'{name}: {importance}')

# 预测并评估
y_pred = [1 if p >= 0.5 else 0 for p in model.predict(X_test)]
print(f'测试集准确率: {accuracy_score(y_test, y_pred):.2f}')

内容的提问来源于stack exchange,提问作者sazearte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:30:53