【问题标题】:Why is ColumnTransformer producing a different output using the same code but different .csv files?为什么 ColumnTransformer 使用相同的代码但不同的 .csv 文件产生不同的输出?
【发布时间】:2021-04-17 01:07:01
【问题描述】:

我正在努力完成this 牙齿和指甲课程,希望能够在春季之前完成这种入门级别的工作。这是我在这个令人难以置信的资源上的第一篇文章,并将尽我所能符合发布格式。作为加强我的学习和致力于长期记忆的一种潜在方法,我正在我自己的数据集上尝试相同的事情,该数据集包含超过 500 个条目,其中包含与我更相关的数据而不是虚拟数据。

如果我理解正确的话,我正在学习数据预处理阶段,您可以在其中填写缺失值并将列分成各自的 X 和 Y,以便稍后输入模型。

所以在课程示例中,它是左上角的国家数据集。然后左下角是我自己的数据库,我在我玩的多人游戏中保存了大约一年。它有 100 个左右的角色,您可以从 5 种不同类别的角色中进行选择。

Course data set (top left) personal dataset (bottom left personal dataset column transformed results

产生的不同输出是怎么回事,唯一的区别是数据集(.csv 文件)?该课程的数据集看起来不错;第一列国家(文本类别)在输出中变成二进制向量吗?为什么我的数据集上的输出省略了列,并产生了这些看起来很奇怪的元组,后面跟着一个看起来像随机数的东西?我尝试删除 np.array 函数,尝试在每个级别打印每个输出,但无法查看导致差异的原因。我希望在我的数据集上它将字符的名称转换为二进制向量(1s/0s 的组合?),以便计算机可以理解差异并将它们映射到适当的结果。相反,我得到了我以前从未见过的奇怪的输出。

编辑:事实证明,这些奇怪的数字组合就是所谓的“稀疏矩阵”。必须从产生 csr_array 的 type() 开始做一些研究。如果我理解我正确阅读的内容,那么里面的所有内容都占一列,所以我只是使用 [:] 尝试了所有行/列,我没有收到错误。

非常感谢您的时间和帮助。

编辑:多亏了这个线程,我才能够完成这个数据预处理/导入/清理/阶段练习,使用我自己的约 550 行数据集进行特征缩放。

import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split

# IMPORT RAW DATA // ASSIGN X AND Y RAW
df = pd.read_csv('datasets/winpredictor.csv')

X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

# TRANSFORM CATEGORICAL DATA
ct = ColumnTransformer(transformers=\
[('encoder', OneHotEncoder(), [0, 1])], remainder='passthrough')
le = LabelEncoder()

X = ct.fit_transform(X)
y = le.fit_transform(y)

# SPLIT THE DATA INTO TRAINING AND TEST SETS
X_train, X_test, y_train, y_test = train_test_split(\
X, y, train_size=.8, test_size=.2, random_state=1)

# FEATURE SCALING
sc = StandardScaler(with_mean=False)

X_train[:, :] = sc.fit_transform(X_train[:, :])
X_test[:, :] = sc.transform(X_test[:, :])

【问题讨论】:

    标签: scikit-learn data-science data-preprocessing


    【解决方案1】:

    首先,我鼓励您继续使用本课程,并确保您将在几周内成为完美的数据科学。

    让我们谈谈你的问题。它似乎你只有由于不同类型的“英雄”的大尺寸而存在可视化问题(我认为你有37个独特的值)。

    我会向你解释你绘制的结果。他们的编程器仅向您指出不同0:

    的样本的值
    • (0,10)= 1 - > 0是指第一个样品,10表示第10个 等于1的样本的值。 em>

    • (0,37)= 5 - > 0是指第一样品,37是指第37个,等于5。 Em>

    等..

    所以你的第一个样本会像:

    [0,0,0,0,0,0,0,0,0,0,1,.........., 5, 980,-30, 1000, 6023]
    

    这是表达“Jakiro”的第一个样本的方法。

    ["Jakiro",5, 980,-30, 1000, 6023]
    

    to sumpul,前37个值是指您的OneHotEncoder,最后5个是指您的初始数值。

    所以它似乎是正确的,只是一种不同的方法来绘制由于分类变量的大小的大小。

    您可以尝试缩小x行的数量(例如4个),并尝试相同的进程。然后您将具有与课程类似的输出。

    【讨论】:

    • 令人敬畏,谢谢你的回复。我有一种感觉,可能与较大数量的独特价值有关,是的,其中37岁。发生在其他栏中的事情?不是我想要转换的x列的列?或者是整行的奇怪可视化吗?另外,如果它只是一种对数据进行不同的方式,结果是相同的吗?也就是说,如果将这些变量馈入线性回归,则输出是否正确?再次感谢。最后,第二列1-5是类别。我可以只将代码更改为[('occoder',onehotencoder(),[0,1])]? span>
    • 您只是因为[0]而转换第一列“Heros”。其他列没有变换。输出是程序用于可视化所有行的方式(如果它不是转换列或不差异化)。如果您使用另一种编码方式,您应该获得类似的结果(由于算法中可能不相同)。我强烈建议您使用pd.get_dummies(),您将更轻松您在做什么。 span>
    • 令人敬畏,我会很快在谷歌上查看:-)。我想我已经准备好继续回归!顺便说一下,我应该完全尝试这一点,我自己尝试了这个,减少类别的数量将可视化(表示?)更改为课程中的一个,1s和0s。实际上,我更改了列,因为列[1]不是整数但数字类别;其中只有5个,它输出我的预期。因此,我将保留代码[('编码器',onehotencoder(),[0,1])]并假设分配给X的任何东西是我期望计算机记住的内容。 thnx再次 span>
    • 希望它帮助您!哦,现在我向第二列带来了你的意思。真实,虽然它们是int,但必须作为类别视为。干得好!
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2019-10-07
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多