Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致ColumnTransformer出现这种奇怪的行为?[Python/sklearn]_Python_Scikit Learn - Fatal编程技术网

是什么导致ColumnTransformer出现这种奇怪的行为?[Python/sklearn]

是什么导致ColumnTransformer出现这种奇怪的行为?[Python/sklearn],python,scikit-learn,Python,Scikit Learn,下面我有一些代码,我不明白为什么会产生这样的结果 我正在尝试使用ColumnTransformer,但在获得正确结果时遇到了一些问题 我举的例子有点奇怪,但这是我能得到的最简单的可重复的例子。我试图进一步简化示例,但每次尝试时,似乎我都忽略了这个问题,因此,如果示例超出了需要,我向您道歉 from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.preproce

下面我有一些代码,我不明白为什么会产生这样的结果

我正在尝试使用
ColumnTransformer
,但在获得正确结果时遇到了一些问题

我举的例子有点奇怪,但这是我能得到的最简单的可重复的例子。我试图进一步简化示例,但每次尝试时,似乎我都忽略了这个问题,因此,如果示例超出了需要,我向您道歉

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
import numpy as np

samples = np.array([[0, 0, 0, 'Education', 7432, 2008.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [9, 0, 0, 'Office', 27000, 2010.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [3, 0, 0, 'Education', 23685, 2002.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [7, 0, 0, 'Education', 121074, 1989.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [4, 0, 0, 'Education', 116607, 1975.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [1, 0, 0, 'Education', 2720, 2004.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [2, 0, 0, 'Education', 5376, 1991.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0, 0.0, 1.0,
                     0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0, 1.0, 2016,
                     0.0, 1.0],
                    [6, 0, 0, 'Lodging/residential', 27926, 1981.0, np.nan, 25.0, 6.0, 20.0, np.nan, 1019.7, 0.0, 0.0,
                     0.0, 1.0, 0.5406408174555976, 0.8412535328311812, -0.8660254037844385, -0.5000000000000004, 0.0,
                     1.0, 2016, 0.0, 1.0]])

categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

scaler = ColumnTransformer(transformers=[("cat", categorical_transformer, [0, 1, 3, 4])])
print(scaler.fit_transform(samples[:5]))
print(scaler.fit_transform(samples[:6]))
因此,对于
示例[:5]
数组子集,我得到以下结果:

[[1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1. 1. 0. 1. 0. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0. 1. 1. 0. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 1. 1. 0. 1. 0. 0. 0. 0.]]
这是我所期望的,也得到了同样的结果

但是,当我对
样本[:6]
数组子集进行转换时

我明白了

  (0, 0)    1.0
  (0, 6)    1.0
  (0, 7)    1.0
  (0, 14)   1.0
  (1, 5)    1.0
  (1, 6)    1.0
  (1, 8)    1.0
  (1, 12)   1.0
  (2, 2)    1.0
  (2, 6)    1.0
  (2, 7)    1.0
  (2, 11)   1.0
  (3, 4)    1.0
  (3, 6)    1.0
  (3, 7)    1.0
  (3, 10)   1.0
  (4, 3)    1.0
  (4, 6)    1.0
  (4, 7)    1.0
  (4, 9)    1.0
  (5, 1)    1.0
  (5, 6)    1.0
  (5, 7)    1.0
  (5, 13)   1.0

我不知道这种数据格式是什么。我想弄清楚为什么我的定标器在添加额外样本时会返回这种类型的数据。

如注释中所述,答案是相同的,但以稀疏表示。一种方法是使用
todense()
将稀疏数组转换为密集数组

另一种方法是在
OneHotEncoder
本身中设置
sparse=False

categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=False))])

scaler = ColumnTransformer(transformers=[("cat", categorical_transformer, [0, 1, 3, 4])])

请记住,将输出转换为稠密会带来更高的计算和内存成本。如果要处理大型数据集,建议将其本身作为稀疏数组

正如评论中所提到的,答案是一样的,只是用稀疏表示。一种方法是使用
todense()
将稀疏数组转换为密集数组

另一种方法是在
OneHotEncoder
本身中设置
sparse=False

categorical_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=False))])

scaler = ColumnTransformer(transformers=[("cat", categorical_transformer, [0, 1, 3, 4])])

请记住,将输出转换为稠密会带来更高的计算和内存成本。如果要处理大型数据集,建议将其本身作为稀疏数组

您看到的是稀疏表示。样本量越大,以稀疏格式存储这些二进制矩阵的效率就越高。尝试
scaler.fit\u transform(示例[:6]).todense()
查看更熟悉的表示法。您看到的是稀疏表示法。样本量越大,以稀疏格式存储这些二进制矩阵的效率就越高。尝试
scaler.fit\u transform(示例[:6]).todense()
查看更熟悉的表示。