在sklearn中,一个热编码分类特征用作具有数字特征的训练数据

2024-06-28 11:53:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图训练一个模型,从csv中读取数据作为训练数据。为此,我尝试对分类特征进行一次热编码,然后将结果数组1和0作为特征传递给features,同时只传递普通的数字特征。在

我有以下代码:

X = pd.read_csv('Data2Cut.csv')

Y = X.select_dtypes(include=[object])

le = preprocessing.LabelEncoder()

Y_2 = Y.apply(le.fit_transform)


enc = preprocessing.OneHotEncoder()

enc.fit(Y_2)

onehotlabels = enc.transform(Y_2).toarray()
onehotlabels.shape

features = []
labels = []
mycsv = csv.reader(open('Data2Cut.csv'))
indexCount = 0
for row in mycsv:
  if indexCount < 8426:
    features.append([onehotlabels[indexCount], row[1], row[2], row[3], row[6], row[8], row[9], row[10], row[11]])
    labels.append(row[12])
    indexCount = indexCount + 1

training_data = np.array(features, dtype = 'float_')
training_labels = np.array(labels, dtype = 'float_')

log = linear_model.LogisticRegression()
log = log.fit(training_data, training_labels)
joblib.dump(log, "modelLogisticRegression.pkl")

它似乎已经到了底线:

^{pr2}$

在它崩溃之前给出以下错误:

ValueError: setting an array element with a sequence.

我想这是一个热编码值是数组而不是浮点的结果。如何更改/调整此代码以处理分类和数字特性作为训练数据?在

编辑:我正在输入的行的一个示例,其中每个列都是一个要素:

mobile, 1498885897, 17491407,   23911,  west coast, 2,  seagull, 18,    41.0666666667,  [0.325, 0.35],  [u'text', u'font', u'writing', u'line'],    102, 5  
#...

Tags: csv数据log编码labelstraining分类特征
2条回答

你一定已经找到了你的答案,但是我把我的发现(我也在为同样的问题而挣扎)贴在这里给那些有同样问题的人。实现这一点的方法是将生成的编码稀疏矩阵的列附加到训练数据帧中。E、 g.(忽略第一行价格的错误):

Source: https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f

如果您的类别中没有太多的唯一值,这当然是一个实用的解决方案。您可以研究更高级的编码方法,例如Backward Difference CodingPolynomial Coding,以解决分类特征可以采用许多不同值的情况。在

您使用的是哪个版本的sklearn?在

我看到在sklearn版本0.18.1中,传递1d数组作为数据是不推荐的,并给出如下警告,并且没有给出所需的结果。在

不推荐警告:在0.17中不推荐将1d数组作为数据传递,并将在0.19中引发ValueError。如果数据只有一个特征,则使用X.reshepe(-1,1)重塑数据;如果数据包含单个样本,则使用X.reshepe(1,-1)重塑数据。 折旧警告)

尝试替换以下代码行

onehotlabels = enc.transform(Y_2).toarray()

到下面一个

^{pr2}$

或者您可以使用pd.get_dummies来获得一个热编码的特征矩阵。在

相关问题 更多 >