首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标签编码器和OneHotEncoder的值误差

标签编码器和OneHotEncoder的值误差
EN

Stack Overflow用户
提问于 2017-07-06 17:22:51
回答 1查看 1.5K关注 0票数 1

我试图将一个分类字符串列转换为几个虚拟变量二进制列,但我得到了一个值错误。

下面是代码:

代码语言:javascript
复制
import sys, os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from dateutil import parser
import math
import traceback
import logging
datasetMod = pd.read_csv('data.csv')

X = datasetMod.iloc[:, 3:6].values
y = datasetMod.iloc[:, 1].values
print(X[:, 0])

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
try:
    labelencoder_X = LabelEncoder()
    X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
    onehotencoder = OneHotEncoder(categorical_features = [0])
    X = onehotencoder.fit_transform(X).toarray()
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print(exc_type, fname, exc_tb.tb_lineno)

以下是错误:

代码语言:javascript
复制
<class 'ValueError'> multipleLinearRegression.py 23

该列的打印语句的结果是:

代码语言:javascript
复制
['Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Weekend' 'Workday' 'Workday' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday' 'Workday'
 'Workday' 'Workday' 'Workday' 'Workday' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend' 'Weekend'
 'Weekend' 'Weekend' 'Weekend' 'Weekend']

字符串本身似乎没有什么问题,中间没有空格,也没有像符号那样的数字。所以我不明白为什么我得到的值类型不能将字符串转换为浮动错误。

任何帮助都将不胜感激。

更新

一个编码器现在工作得还不错,但是最终结果是类型对象,而它应该是float64类型的:

代码语言:javascript
复制
labelencoder_X = LabelEncoder()
X[:, 1] = labelencoder_X.fit_transform(X[:, 1])
X[:, 2] = labelencoder_X.fit_transform(X[:, 2])
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [1,2,3])
onehotencoder.fit(X[:, 1])
onehotencoder.fit(X[:, 2])
onehotencoder.fit(X[:, 3])
onehotencoder.transform(X[:, 1])
onehotencoder.transform(X[:, 2])
onehotencoder.transform(X[:, 3])
X = onehotencoder.toArray()  

更新2

代码语言:javascript
复制
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder_X = LabelEncoder()
X[:, 1] = labelencoder_X.fit_transform(X[:, 1])
X[:, 2] = labelencoder_X.fit_transform(X[:, 2])
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])

onehotencoder = OneHotEncoder(categorical_features = [1,2,3])
X[:, 1] = onehotencoder.fit_transform(X[:, 1]).toarray()
X[:, 2] = onehotencoder.fit_transform(X[:, 2]).toarray()
X[:, 3] = onehotencoder.fit_transform(X[:, 3]).toarray()

print(X.dtype) #object

最终代码

由于categorical_features已经指定了索引,所以我可以对整个矩阵X进行fit_transform()。感谢@mkos的耐心!

代码语言:javascript
复制
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 1] = labelencoder_X.fit_transform(X[:, 1])
X[:, 2] = labelencoder_X.fit_transform(X[:, 2])
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [1,2,3])
X = onehotencoder.fit_transform(X)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 19:02:53

这应该能起作用:

代码语言:javascript
复制
onehotencoder = OneHotEncoder(categorical_features = [1,2,3])
X = onehotencoder.fit_transform(X)

你可以用以下方式打印:

代码语言:javascript
复制
print(X.toArray())

X作为稀疏矩阵并不坏,因为它节省了内存。如果您想要看到它,那么您可以将它转换为带有np.array的普通toArray()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44955384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档