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

使用SVM进行流量分类时遇ValueError:Input X包含NaN的解决咨询

解决SVM训练时"Input X contains NaN"错误的方案

核心问题定位

你的代码中缺失值处理未生效,pandas的fillna()方法默认返回新DataFrame,不会修改原数据对象。此外还需排查其他可能生成NaN的环节。

分步解决建议

1. 修复缺失值处理代码

将ds.fillna(0)修改为以下两种有效方式之一:

# 方式1:赋值回原数据集(推荐,避免原地修改的潜在风险)
ds = ds.fillna(0)

# 方式2:原地修改数据集
ds.fillna(0, inplace=True)

执行后可通过print(ds.isna().sum())验证所有列的缺失值是否已被填充。

2. 检查特征集X的数据类型

确保X中所有列均为数值类型(int/float),若存在字符串列,标准化过程会生成NaN。用以下代码检查:

print(X.dtypes)

若发现非数值列,需先做编码处理(如One-Hot编码)或直接移除该列。

3. 处理标准化前的无穷大值

数据中存在无穷大值时,标准化后会转为NaN。添加以下代码提前处理:

import numpy as np
# 替换无穷大值为0
X = X.replace([np.inf, -np.inf], 0)

4. 验证标准化后的数据集

标准化后可通过以下代码确认是否还存在NaN:

print(np.isnan(X_Train).any())
print(np.isinf(X_Train).any())

完整修正后的代码示例

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

# 读取数据集并处理缺失值
ds = pd.read_csv("dataset_sdn.csv")
ds = ds.fillna(0)

# 提取特征和标签
X = ds.iloc[:, [4,5,6,7,8,9,10,11,12,13,14,17,18,19,20,21]]
Y = ds.iloc[:, 22]

# 替换无穷大值
X = X.replace([np.inf, -np.inf], 0)

# 划分训练测试集
X_Train, X_Test, Y_Train, Y_Test = train_test_split(X, Y, test_size=0.25, random_state=0)

# 标准化
sc_X = StandardScaler()
X_Train = sc_X.fit_transform(X_Train)
X_Test = sc_X.transform(X_Test)

# 训练SVM并预测
classifier = SVC(kernel='linear', random_state=0)
classifier.fit(X_Train, Y_Train)
Y_pred = classifier.predict(X_Test)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:58:01