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

如何用OneHotEncoder编码CSV解决足球预测模型的字符串转浮点数错误?

解决足球比赛预测AI的字符串转数值错误及分类特征编码方案

错误原因

你的特征集x包含Date(字符串日期)、Match_Name、Home等非数值型列,而Sklearn的LogisticRegression模型仅支持数值型输入,无法直接将字符串转为浮点数,因此触发ValueError。

分步解决方案

1. 处理日期特征

日期字符串不能直接编码,需提取有预测价值的数值特征:

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 读取数据并转换日期格式
df = pd.read_csv("fulldata.csv")
df['Date'] = pd.to_datetime(df['Date'])

# 提取日期相关数值特征
df['Match_Year'] = df['Date'].dt.year
df['Match_Month'] = df['Date'].dt.month
df['Match_Day'] = df['Date'].dt.day
df['Match_Hour'] = df['Date'].dt.hour

# 删除原日期列
df.drop(columns=['Date'], inplace=True)

2. 编码分类特征

剩余字符串列属于分类变量,需转为数值型,以下两种方法任选:

方法一:Pandas get_dummies(快速上手)

适合小规模数据集,代码简洁:

# 指定所有分类列
categorical_cols = ['Match_Name', 'Short_Name', 'Season_Name', 'Season_Type_Name', 'Season_Type_Abbreviation', 'Home', 'Away']

# 生成哑变量,drop_first=True避免多重共线性问题
df_encoded = pd.get_dummies(df, columns=categorical_cols, drop_first=True)

# 准备特征和标签
x = df_encoded.drop(columns=['Home_Results', 'Away_Results'])
y = df_encoded['Home_Results']

# 训练模型(建议加大max_iter避免收敛失败)
model = LogisticRegression(max_iter=1000)
model.fit(x, y)

方法二:Sklearn OneHotEncoder(工业级规范)

适合流水线构建、大规模数据集,支持处理训练集外的未知分类值:

# 定义数值列和分类列
numeric_cols = ['Season_Year', 'Match_Year', 'Match_Month', 'Match_Day', 'Match_Hour']
categorical_cols = ['Match_Name', 'Short_Name', 'Season_Name', 'Season_Type_Name', 'Season_Type_Abbreviation', 'Home', 'Away']

# 构建预处理管道:数值列直接保留,分类列做OneHot编码
preprocessor = ColumnTransformer(
    transformers=[
        ('numeric', 'passthrough', numeric_cols),
        ('categorical', OneHotEncoder(drop='first', handle_unknown='ignore'), categorical_cols)
    ])

# 组合预处理和模型成流水线
model_pipeline = Pipeline(steps=[
    ('preprocess', preprocessor),
    ('classifier', LogisticRegression(max_iter=1000))
])

# 准备特征和标签
x = df.drop(columns=['Home_Results', 'Away_Results'])
y = df['Home_Results']

# 训练模型
model_pipeline.fit(x, y)

关键注意事项

  • handle_unknown='ignore':确保测试集出现训练集未见过的分类值时,模型不会报错
  • max_iter=1000:LogisticRegression默认迭代次数可能不足,导致收敛失败,需适当增大
  • 若需同时预测Home_Results和Away_Results,可使用MultiOutputClassifier包装LogisticRegression
  • 训练前建议拆分训练集和测试集,避免数据泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:32