我想知道sklearn LabelEncoder和pandas get_dummies之间的区别.为什么选择LabelEncoder而不是get_dummies.使用一个在另一个上的优势是什么?缺点是什么?
据我所知,如果我有A级
ClassA = ["Apple", "Ball", "Cat"]
encoder = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
和
dummy = [001, 010, 100]
Run Code Online (Sandbox Code Playgroud)
我不正确地理解这个吗?
我正在探索scikit学习管道.我还想用管道预处理数据.但是,我的列车和测试数据具有不同级别的分类变量.示例:考虑:
import pandas as pd
train = pd.Series(list('abbaa'))
test = pd.Series(list('abcd'))
Run Code Online (Sandbox Code Playgroud)
我用pandas写了一个TransformerMixinClass
class CreateDummies(TransformerMixin):
def transform(self, X, **transformparams):
return pd.get_dummies(X).copy()
def fit(self, X, y=None, **fitparams):
return self
Run Code Online (Sandbox Code Playgroud)
fit_transform产生列车数据2列和测试数据4列.所以这并不奇怪,但不适合管道
同样,我试图导入标签编码器(和OneHotEncoder用于潜在的后续步骤):
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()
le.fit_transform(train)
le.transform(test)
Run Code Online (Sandbox Code Playgroud)
这并不奇怪,这会产生错误.
所以这里的问题是我需要测试集中包含的一些信息.有没有一种好方法将其包含在管道中?
然而,我正在挣扎。我有一列(包含字符串值),例如:
Sex
Male
Female
# This is just as example, in real it is having much more unique values
Run Code Online (Sandbox Code Playgroud)
现在问题来了。我收到了一个新的(唯一的)值,现在我无法再进行预测(例如'Neutral'
添加了)。
由于我正在将'Sex'
列转换为 Dummies,我确实遇到了我的模型不再接受输入的问题,
模型的特征数量必须与输入匹配。模型 n_features 为 2,输入 n_features 为 3
因此我的问题是:有没有办法让我的模型健壮,而忽略这个类?但是在没有具体信息的情况下进行预测?
我尝试过的:
df = pd.read_csv('dataset_that_i_want_to_predict.csv')
model = pickle.load(open("model_trained.sav", 'rb'))
# I have an 'example_df' containing just 1 row of training data (this is exactly what the model needs)
example_df = pd.read_csv('reading_one_row_of_trainings_data.csv')
# Checking for missing columns, and adding that to …
Run Code Online (Sandbox Code Playgroud) 一些建模功能,例如glmnet()
,要求(或仅允许)将数据作为预测器矩阵和响应矩阵(或向量)传递,如使用公式所示。在这些情况下,通常情况是该predict()
方法(例如predict.glmnet()
)要求newdata
参数提供一个预测器矩阵,该矩阵具有与训练模型相同的特征。
当数据框具有因子(R的分类数据类型)时,创建预测变量矩阵的便捷方法是使用该model.matrix()
函数,该函数会自动为分类变量创建虚拟特征:
# this is the dataframe and matrix I want to use to train the model
set.seed(1)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
x2 = rnorm(20, 100, 5),
x3 = factor(sample(c("U","L"), replace = T, 20)),
y = rnorm(20, 10, 2))
mm <- model.matrix(y~., data = df)
Run Code Online (Sandbox Code Playgroud)
但是,当我引入一个带有新观察结果的数据框时,它仅包含原始数据框中因子水平的一个子集,model.matrix()
(可预测地)返回一个具有不同虚拟特征的矩阵。无法使用此新矩阵,predict.glm()
因为它没有模型期望的相同功能:
# this is the dataframe and matrix I want to predict on
set.seed(1) …
Run Code Online (Sandbox Code Playgroud)