SKlearn ColumnTransformer 包括不需要在管道中转换/预处理的现有特征(例如:布尔值)



我已经有一些布尔特征(1 或 0(,但我有一些需要 OHE 的分类变量和一些需要插补/缩放的数字变量......我可以将分类变量 + 数字变量添加到管道列转换器,但如何将布尔特征添加到管道中,以便将它们包含在模型中? 找不到任何例子或一个好的短语来搜索这种困境......有什么想法吗?

这是 sklearn 结合 num 和 cat 管道的示例,但是如果我的某些功能已经是布尔形式 (1/0( 并且不需要预处理/OHE 怎么办......如何保留这些功能(即使用 num 和 cat 变量将其添加到管道中(?

来源: https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html

titanic_url = ('https://raw.githubusercontent.com/amueller/scipy-2017-sklearn/091d371/notebooks/datasets/titanic3.csv')
data = pd.read_csv(titanic_url)
numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])
categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])
clf = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LogisticRegression(solver='lbfgs'))])
X = data.drop('survived', axis=1)
y = data['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf.fit(X_train, y_train)
print("model score: %.3f" % clf.score(X_test, y_test))

我在这里找到了我自己的问题......使用 ColumnTransformer,我可以向列表中添加更多功能(即numeric_features和categorical_features就像我问题中的代码一样(,而使用 FeatureUnion,我可以使用这个 DF 选择器类向管道添加功能......详细信息可以在此笔记本中找到=> https://github.com/ageron/handson-ml/blob/master/02_end_to_end_machine_learning_project.ipynb

# Create a class to select numerical or categorical columns 
class PandasDataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values
# ex
feature_list = [...]
("num_features", Pipeline([
                    ("select_num_features", PandasDataFrameSelector(feature_list)),
                    ("scales", StandardScaler())

使用 remainder='passthrough 遍历column_transformers列表中未处理的任何列。也就是说,@thePurplePython答案可能非常有用。

preprocessor_pipeline = sklearn.compose.ColumnTransformer(column_transformers, remainder='passthrough')

或者,传递"直通"的管道三元组,而不是转换器函数和要传递的列列表。

('passthrough','passthrough',passthrough_columns)

相关内容

最新更新