【发布时间】:2021-01-31 21:25:27
【问题描述】:
我正在尝试运行一个基本模型,但似乎我的管道的插补阶段失败了,我真的不明白为什么。
这是最小的可复制代码
如果您愿意,可以找到x 和y 的数据。最初它们位于一个公共文件中,我可以轻松地将它们链接到,但我对它们进行了一些转换,因此我将使用编辑后的输出来减少你必须阅读的代码。但是,如果需要,我可以轻松链接到原始代码和数据集。
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier,AdaBoostRegressor,AdaBoostClassifier,RandomForestRegressor
from category_encoders import CatBoostEncoder,CountEncoder,TargetEncoder,SumEncoder
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
import datetime as dt
x = pd.read_csv("/home/user/Python Practice/Working/Playstore/x.csv",index_col=("Unnamed: 0"))
y = pd.read_csv("/home/user/Python Practice/Working/Playstore/y.csv",index_col=("Unnamed: 0"))
# Set up Imputers
strat = ["mean","median","most_frequent","constant"]
num_imp = SimpleImputer(strategy=strat[0])
obj_imp = SimpleImputer(strategy=strat[2])
# Set up the scaler
sc = StandardScaler()
# Set up Encoders
cb = CatBoostEncoder()
oh = OneHotEncoder()
# Set up columns
obj = list(x.select_dtypes(include="object"))
num = list(x.select_dtypes(exclude="object"))
cb_col = [i for i in obj if len(x[i].unique())>30]
oh_col = [i for i in obj if len(x[i].unique())<10]
# Col Transformation
col = make_column_transformer((cb,cb_col),
(obj_imp,cb_col),
(oh,oh_col),
(obj_imp,oh_col),
(num_imp,num),
(sc,num))
model = AdaBoostRegressor(random_state=(0))
#Second Pipeline
run = make_pipeline((col),(model))
run.fit(x,y)
print("The score is",run.score(x,y))
模型在.fit 阶段崩溃并显示错误消息:ValueError: Input contains NaN。我估算后为什么要这样做?我该如何解决?
【问题讨论】:
-
您的一些分类列既没有使用您的样本数据进行估算也没有转换:“类型”和“内容评级”。这是故意的吗?
-
@BillHuang 无意。感谢那。
oh_col应该是len(x[i].unique())<10而不是>。我会修复它。错误仍然存在。有什么想法吗? -
你有理由坚持
make_column_transformer和make_pipeline吗?它似乎不适用于对象列上的 Imputer。 Scaler 在管道中的行为也很奇怪,如果不使用数据管道,则不会出现ValueError。如果没有原因,那么我想我已经解决了......
标签: python pandas scikit-learn feature-selection feature-engineering