为什么 SimpleImputer 返回分类数据?
Why is SimpleImputer returning categorical data?
我使用 fillna
作为数值列,使用 SimpleImputer
作为分类列,将值输入数据框。问题是,当我 运行 以下代码时,我注意到我所有的特征都是分类的。
X = X.fillna(X.mean())
X_test = X_test.fillna(X_test.mean())
object_imputer = SimpleImputer(strategy="most_frequent")
X_temp = pd.DataFrame(object_imputer.fit_transform(X))
X_temp_test = pd.DataFrame(object_imputer.fit_transform(X_test))
X_temp.columns = X.columns
X_temp_test.columns = X_test.columns
X, X_test = X_temp, X_temp_test
fillna
工作正常,但 SimpleImputer
给我带来了问题。
你能告诉我问题是什么以及如何解决吗?提前致谢
在我说别的之前,请注意您正在将您的 imputer 安装在 X
上,然后安装在 X_test
上。你不应该这样做。相反,您应该始终将您的输入拟合到训练数据上,然后使用该实例来转换两个数据集(训练和测试数据)。
话虽如此,您的问题是您正在拟合和转换所有列。因此,imputer 正在将所有列转换为类型 object
.
我相信这会解决您的问题:
# Impute NaNs of numeric columns
X = X.fillna(X.mean())
X_test = X_test.fillna(X_test.mean())
# Subset of categorical columns
cat = ['Loan_ID','Gender','Married','Dependents','Education','Self_Employed',
'Credit_History','Loan_Status']
# Fit Imputer on traing data and ONLY on categorical columns
object_imputer = SimpleImputer(strategy='most_frequent').fit(X[cat])
# Transform ONLY categorical columns
X[cat] = object_imputer.transform(X[cat])
X_test[cat] = object_imputer.transform(X_test[cat])
如您所见,所有列现在都具有正确的数据类型。
X.dtypes
Loan_ID object
Gender object
Married object
Dependents object
Education object
Self_Employed object
ApplicantIncome int64
CoapplicantIncome float64
LoanAmount float64
Loan_Amount_Term float64
Credit_History float64
Property_Area object
Loan_Status object
dtype: object
我使用 fillna
作为数值列,使用 SimpleImputer
作为分类列,将值输入数据框。问题是,当我 运行 以下代码时,我注意到我所有的特征都是分类的。
X = X.fillna(X.mean())
X_test = X_test.fillna(X_test.mean())
object_imputer = SimpleImputer(strategy="most_frequent")
X_temp = pd.DataFrame(object_imputer.fit_transform(X))
X_temp_test = pd.DataFrame(object_imputer.fit_transform(X_test))
X_temp.columns = X.columns
X_temp_test.columns = X_test.columns
X, X_test = X_temp, X_temp_test
fillna
工作正常,但 SimpleImputer
给我带来了问题。
你能告诉我问题是什么以及如何解决吗?提前致谢
在我说别的之前,请注意您正在将您的 imputer 安装在 X
上,然后安装在 X_test
上。你不应该这样做。相反,您应该始终将您的输入拟合到训练数据上,然后使用该实例来转换两个数据集(训练和测试数据)。
话虽如此,您的问题是您正在拟合和转换所有列。因此,imputer 正在将所有列转换为类型 object
.
我相信这会解决您的问题:
# Impute NaNs of numeric columns
X = X.fillna(X.mean())
X_test = X_test.fillna(X_test.mean())
# Subset of categorical columns
cat = ['Loan_ID','Gender','Married','Dependents','Education','Self_Employed',
'Credit_History','Loan_Status']
# Fit Imputer on traing data and ONLY on categorical columns
object_imputer = SimpleImputer(strategy='most_frequent').fit(X[cat])
# Transform ONLY categorical columns
X[cat] = object_imputer.transform(X[cat])
X_test[cat] = object_imputer.transform(X_test[cat])
如您所见,所有列现在都具有正确的数据类型。
X.dtypes
Loan_ID object
Gender object
Married object
Dependents object
Education object
Self_Employed object
ApplicantIncome int64
CoapplicantIncome float64
LoanAmount float64
Loan_Amount_Term float64
Credit_History float64
Property_Area object
Loan_Status object
dtype: object