如何使用管道 API 标记编码?
How do I Label Encode using the Pipeline API?
我想通过 scikit 学习管道合并标签编码。不幸的是,LabelEncoder() 被管道 API 破坏了,所以现在这不是一个选项。我尝试创建自己的 class,它调用 .map() 将类别映射到标签:
from sklearn.base import TransformerMixin
from sklearn.base import BaseEstimator
class RatingEncoder(BaseEstimator, TransformerMixin):
"""Takes in dataframe, converts all categorical Ratings columns into numerical Ratings columns
via label-encoding"""
def __init__(self):
pass
def fit(self, df, y=None):
return self
def transform(self, df, y=None):
""""Transform all of the categorical ratings columns into numerical ratings columns"""
for feature in df.columns:
df[feature] = df[feature].map({
"Po" : 1,
"Fa" : 2,
"TA" : 3,
"Gd" : 4,
"Ex" : 5,
})
return df
然后,我设置了以下管道:
def select_numeric_features(df):
return df.select_dtypes(include=np.number).columns
def select_categorical_features(df):
return df.select_dtypes(exclude=np.number).columns
def select_rated_features(df):
rated_features = []
for column in df:
# This criteria determines if a column is a 'rated column'
if any(df[column] == 'TA'):
rated_features.append(column)
return rated_features
pipeline = make_column_transformer(
(RatingsTransformer(), select_rated_features),
(SimpleImputer(strategy='constant', fill_value='None'), select_categorical_features),
(SimpleImputer(strategy='constant', fill_value=0), select_numeric_features),
remainder='passthrough'
)
问题是在 RatingsTransformer() 步骤之后,分类 'ratings' 列应该变成数字列。但是,此更改不会显示在列转换器的列选择部分,因此 select_numerical_features
和 select_categorical_features
将选择不正确的 'ratings' 列,就好像它们没有从类别中映射一样到价值观。基本上,列转换器不使用在管道中间更新的列。有什么解决方法吗?或者,是否有使用管道 API?
的更简单的 LabelEncoding 解决方案
LabelEncoder
是编码标签,因此是 y
(或目标)。如果你想编码数据(即 X
),你可以使用 OneHotEncoder
或 OrdinalEncoder
,它们可以很容易地集成到 scikit-learn 的 Pipeline
中。
在您的情况下,您似乎想要对数据进行序号编码。
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder
preprocessor = make_pipeline(
SimpleImputer(strategy="constant", fill_value="missing"),
OrdinalEncoder()
)
preprocessor.fit_transform(X_train)
如果分类器不是线性模型(例如 RandomForestClassifier
),您可以想象使用 OrdinalEncoder
而不是 OneHotEncoder
。
我想通过 scikit 学习管道合并标签编码。不幸的是,LabelEncoder() 被管道 API 破坏了,所以现在这不是一个选项。我尝试创建自己的 class,它调用 .map() 将类别映射到标签:
from sklearn.base import TransformerMixin
from sklearn.base import BaseEstimator
class RatingEncoder(BaseEstimator, TransformerMixin):
"""Takes in dataframe, converts all categorical Ratings columns into numerical Ratings columns
via label-encoding"""
def __init__(self):
pass
def fit(self, df, y=None):
return self
def transform(self, df, y=None):
""""Transform all of the categorical ratings columns into numerical ratings columns"""
for feature in df.columns:
df[feature] = df[feature].map({
"Po" : 1,
"Fa" : 2,
"TA" : 3,
"Gd" : 4,
"Ex" : 5,
})
return df
然后,我设置了以下管道:
def select_numeric_features(df):
return df.select_dtypes(include=np.number).columns
def select_categorical_features(df):
return df.select_dtypes(exclude=np.number).columns
def select_rated_features(df):
rated_features = []
for column in df:
# This criteria determines if a column is a 'rated column'
if any(df[column] == 'TA'):
rated_features.append(column)
return rated_features
pipeline = make_column_transformer(
(RatingsTransformer(), select_rated_features),
(SimpleImputer(strategy='constant', fill_value='None'), select_categorical_features),
(SimpleImputer(strategy='constant', fill_value=0), select_numeric_features),
remainder='passthrough'
)
问题是在 RatingsTransformer() 步骤之后,分类 'ratings' 列应该变成数字列。但是,此更改不会显示在列转换器的列选择部分,因此 select_numerical_features
和 select_categorical_features
将选择不正确的 'ratings' 列,就好像它们没有从类别中映射一样到价值观。基本上,列转换器不使用在管道中间更新的列。有什么解决方法吗?或者,是否有使用管道 API?
LabelEncoder
是编码标签,因此是 y
(或目标)。如果你想编码数据(即 X
),你可以使用 OneHotEncoder
或 OrdinalEncoder
,它们可以很容易地集成到 scikit-learn 的 Pipeline
中。
在您的情况下,您似乎想要对数据进行序号编码。
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder
preprocessor = make_pipeline(
SimpleImputer(strategy="constant", fill_value="missing"),
OrdinalEncoder()
)
preprocessor.fit_transform(X_train)
如果分类器不是线性模型(例如 RandomForestClassifier
),您可以想象使用 OrdinalEncoder
而不是 OneHotEncoder
。