Sklearn:分类估算器?
Posted
技术标签:
【中文标题】Sklearn:分类估算器?【英文标题】:Sklearn: Categorical Imputer? 【发布时间】:2017-08-08 08:26:07 【问题描述】:有没有办法使用 sklearn.preprocessing 对象来估算分类值?我想最终创建一个预处理对象,我可以将其应用于新数据,并以与旧数据相同的方式对其进行转换。
我正在寻找一种方法来做到这一点,以便我可以使用它this 方式。
【问题讨论】:
您应该添加更多解释,以及数据以及您想用它做什么? 【参考方案1】:是的,这是可能的。例如,您可以将sklearn.preprocessing.Imputer
与参数strategy = 'most_frequent'
一起使用。
使用fit_transform
方法将其应用于旧数据(训练集),然后将transform
应用于新数据(测试集)。
【讨论】:
好吧,我假设它已经是数字(整数)分类。如果分类数据是字符串格式,首先需要通过例如sklearn.LabelEncoder翻译成数字 当我使用 LabelEncoder 时,我丢失了 numpy.NaN 字段,它们变成了一个数字,然后我无法在下一步中使用 Imputer。 @user1367204,你仍然可以在 Imputer 中使用这个数字,只需将它作为参数 missing_values 传递。可能有更清洁的解决方案,但这个也可以......【参考方案2】:sklearn.preprocessing 中的输入器非常适用于数值变量。 但是对于分类变量,大多数类别是字符串,而不是数字。为了能够使用 sklearn 的 imputers,您需要将字符串转换为数字,然后进行 impute,最后再转换回字符串。
更好的选择是使用sklearn_pandas package中的CategoricalImputer()。。
它用模式替换类似空的值并且适用于字符串列。 sklearn-pandas 包可以通过 pip install sklearn-pandas 安装,可以导入为 import sklearn_pandas
【讨论】:
【参考方案3】:复制修改this的答案,我为pandas.Series对象做了一个imputer
import numpy
import pandas
from sklearn.base import TransformerMixin
class SeriesImputer(TransformerMixin):
def __init__(self):
"""Impute missing values.
If the Series is of dtype Object, then impute with the most frequent object.
If the Series is not of dtype Object, then impute with the mean.
"""
def fit(self, X, y=None):
if X.dtype == numpy.dtype('O'): self.fill = X.value_counts().index[0]
else : self.fill = X.mean()
return self
def transform(self, X, y=None):
return X.fillna(self.fill)
要使用它,你会这样做:
# Make a series
s1 = pandas.Series(['k', 'i', 't', 't', 'e', numpy.NaN])
a = SeriesImputer() # Initialize the imputer
a.fit(s1) # Fit the imputer
s2 = a.transform(s1) # Get a new series
【讨论】:
【参考方案4】:您也可以使用OrdinalEncoder
。
你可以在训练集上训练它,使用函数fit()
,以获得一个模型,然后将模型应用到训练集和测试集上,transform()
:
oe = OrdinalEncoder()
# train the model on a training set of type pandas.DataFrame, for example
oe.fit(df_train)
# transform the training set using the model:
ar_train_encoded = oe.transform(df_train)
# transform the test set using the SAME model:
ar_test_encoded = oe.transform(df_test)
结果是一个 numpy 数组。
【讨论】:
以上是关于Sklearn:分类估算器?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 sklearn 中编写自定义估算器并对其使用交叉验证?