为什么 MLJ 的 OneHotEncoder 没有转换数据框?

如果我遗漏了什么,我很抱歉,但我不知道为什么这不起作用:

using DataFrames, MLJjulia> df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])4×2 DataFrame│ Row │ A     │ B      ││     │ Int64 │ String │├─────┼───────┼────────┤│ 1   │ 1     │ M      ││ 2   │ 2     │ F      ││ 3   │ 3     │ F      ││ 4   │ 4     │ M      │julia> hot_model = OneHotEncoder()julia> hot = machine(hot_model, df)julia> fit!(hot)julia> Xt = MLJ.transform(hot, df)

Xtdf 完全相同,它没有转换列。我尝试在 OneHotEncoder() 中指定特征,但这并没有改变。我还看到可以通过包装它并在最后与模型一起拟合来创建管道,但它应该像那样工作,对吗?是不是因为列的类型?它应该是什么 scitype?是分类类型吗?我怎样才能将其更改为分类类型呢?


回答:

是的,你需要更改列的 scitypes。你可以通过在数据框上使用 schema 来检查每列的 scitype:

julia> schema(df)┌─────────┬─────────┬────────────┐│ _.names │ _.types │ _.scitypes │├─────────┼─────────┼────────────┤│ A       │ Int64   │ Count      ││ B       │ String  │ Textual    │└─────────┴─────────┴────────────┘_.nrows = 4

在这里你可以看到列 B 的 scitype 是 Textual,所以你需要将其更改为 Multiclass。你可以使用 coerce 函数来更改列的 scitypes。请注意,在 MLJ 中,整数列被解释为计数数据,所以如果你希望列 A 代表连续数据,你也需要强制转换它。 coerce 方法的使用如下:

julia> coerce!(df, :A => Continuous, :B => Multiclass)4×2 DataFrame│ Row │ A       │ B    ││     │ Float64 │ Cat… │├─────┼─────────┼──────┤│ 1   │ 1.0     │ M    ││ 2   │ 2.0     │ F    ││ 3   │ 3.0     │ F    ││ 4   │ 4.0     │ M    │

现在单热编码器将正常工作。

ohe = machine(OneHotEncoder(), df)fit!(ohe)Xt = MLJ.transform(ohe, df)
4×3 DataFrame│ Row │ A       │ B__F    │ B__M    ││     │ Float64 │ Float64 │ Float64 │├─────┼─────────┼─────────┼─────────┤│ 1   │ 1.0     │ 0.0     │ 1.0     ││ 2   │ 2.0     │ 1.0     │ 0.0     ││ 3   │ 3.0     │ 1.0     │ 0.0     ││ 4   │ 4.0     │ 0.0     │ 1.0     │

有关更多信息,请参阅 MLJ 手册中关于处理分类数据的部分。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注