gpt4 book ai didi

python - 使用 sklearn OneHotEncoder 时如何忽略数字列?

转载 作者:行者123 更新时间:2023-12-04 15:32:59 26 4
gpt4 key购买 nike

环境:

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.ensemble import RandomForestClassifier

样本数据:
X_train = pd.DataFrame({'A': ['a1', 'a3', 'a2'], 
'B': ['b2', 'b1', 'b3'],
'C': [1, 2, 3]})
y_train = pd.DataFrame({'Y': [1,0,1]})

预期结果:
我想以这种格式在我的管道中包含 sklearn OneHotEncoder:
encoder = ### SOME CODE ###
scaler = StandardScaler()
model = RandomForestClassifier(random_state=0)

# This is my ideal pipeline
pipe = Pipeline([('OneHotEncoder', encoder),
('Scaler', scaler),
('Classifier', model)])
pipe.fit(X_train, y_train)

挑战 :
OneHotEncoder 正在对包括数字列在内的所有内容进行编码。我想保持数字列的原样,并以与 Pipeline() 兼容的有效方式仅对分类特征进行编码。
encoder = OneHotEncoder(drop='first', sparse=False) 
encoder.fit(X_train)
encoder.transform(X_train) # Columns C is encoded - this is what I want to avoid

解决(不理想) :我可以使用 pd.get_dummies() 解决这个问题.但是,这意味着我不能将它包含在我的管道中。或者有什么办法?
X_train = pd.get_dummies(X_train, drop_first=True)

最佳答案

我对此的首选解决方案是使用 sklearn 的 ColumnTransformer (见 here)。

它使您能够根据需要将数据拆分为任意数量的组(在您的情况下,分类数据与数值数据)并对这些组应用不同的预处理操作。然后,该转换器可以像任何其他 sklearn 预处理工具一样在管道中使用。这是一个简短的例子:

import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

X = pd.DataFrame({"a":[1,2,3],"b":["A","A","B"]})
y = np.array([0,1,1])

OHE = OneHotEncoder()
scaler = StandardScaler()
RFC = RandomForestClassifier()

cat_cols = ["b"]
num_cols = ["a"]

transformer = ColumnTransformer([('cat_cols', OHE, cat_cols),
('num_cols', scaler, num_cols)])

pipe = Pipeline([("preprocessing", transformer),
("classifier", RFC)])
pipe.fit(X,y)

注意:我已经根据您的请求获得了一些许可,因为这仅将缩放器应用于数值数据,我认为这更有意义?如果您确实想将缩放器应用于所有列,您也可以通过修改此示例来执行此操作。

关于python - 使用 sklearn OneHotEncoder 时如何忽略数字列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60796133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com