Scikit-learn train_test_split返回异常值问题求助
解决Scikit-learn train_test_split中X_test出现异常值的问题
嘿,我一眼就看到你代码里的关键问题了——传入train_test_split的参数搞混了!这才导致你误以为X_test出现了不属于原数据集的异常值,咱们来一步步理清楚:
1. 核心问题在哪?
你现在的代码里:
X_train, X_test, y_train,y_test = train_test_split(heart_data,hd_y, test_size=0.2, random_state=42)
第一个参数heart_data是完整的数据集(包含所有特征+最后一列的目标值),第二个参数hd_y又是从这个数据集里单独提取的目标列。这就造成了两个问题:
X_train和X_test其实是完整数据集的拆分,里面包含了目标列,你可能误以为X只是特征,所以看到目标列的数值或者缺失值时,错当成了异常值- Cleveland心脏病数据集本身就有缺失值(用
?标记),用np.genfromtxt直接读取时,这些?会被转成nan,要是没提前处理,这些nan也会被你当成“不属于原数据集的异常值”
2. 修正后的正确代码
咱们把特征和目标列严格分开,只把特征作为X传入拆分函数:
from sklearn.model_selection import train_test_split import numpy as np # 读取数据集,同时处理缺失值(把?转成nan) heart_data = np.genfromtxt("cleveland.txt", delimiter=",", missing_values="?", filling_values=np.nan) # 特征列:取前13列(索引0到12) X = heart_data[:, :13] # 目标列:取第14列(索引13) y = heart_data[:, 13] # 正确拆分特征与目标 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 可以先看形状确认拆分是否正确 print("X_train shape:", X_train.shape) print("X_test shape:", X_test.shape)
3. 额外的小建议
- 先验证数据:你可以用
np.unique(X)查看原特征的所有取值,对比X_test的数值,确认是不是真的有异常值,很多时候只是误解 - 处理缺失值:如果确实有
nan,可以用Scikit-learn的SimpleImputer填充,比如用均值填充:from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') X_train = imputer.fit_transform(X_train) X_test = imputer.transform(X_test)
内容的提问来源于stack exchange,提问作者GILO
相关产品推荐
相关产品推荐

