【问题标题】:One hot encoding categorical features to use as training data with numerical features in sklearn一种热编码分类特征,用作 sklearn 中具有数字特征的训练数据
【发布时间】:2017-12-11 05:13:20
【问题描述】:

我正在尝试训练一个从 csv 读取数据作为训练数据的模型。为此,我尝试对分类特征进行一次热编码,然后将生成的 1 和 0 数组作为特征传递,以及普通数字特征。

我有以下代码:

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")

好像快到了:

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

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

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  
#...

【问题讨论】:

  • 试过这个,但它给出了同样的错误
  • 你能提供一些你的数据吗?调试会很有帮助。
  • 添加了一个示例行!
  • 这是来自 PostData2Cut 还是 Data2Cut?后者如何相关?你也可以发一下吗?
  • 我的错误 - 我复制了错误的名称 - 两者都是 Data2Cut.csv - 仍然是同样的错误。

标签: python csv machine-learning scikit-learn one-hot-encoding


【解决方案1】:

您一定已经找到了答案,但我将我的发现(我一直在努力)在这里发布给有相同问题的人。实现这一点的方法是将生成的编码稀疏矩阵的列附加到您的训练数据帧中。例如。 (忽略第一行价格的错误):

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

【讨论】:

    【解决方案2】:

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

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

    DeprecationWarning:将一维数组作为数据传递在 0.17 中已弃用,并将在 0.19 中引发 ValueError。如果您的数据具有单个特征,则使用 X.reshape(-1, 1) 或 X.reshape(1, -1) 如果它包含单个样本,则使用 X.reshape(1, -1) 重塑您的数据。 弃用警告)

    尝试替换以下代码行

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

    到下面一个

    onehotlabels = enc.transform(Y_2.reshape((-1,1)).toarray()
    

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

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2019-05-30
      • 2017-10-21
      • 2016-05-08
      • 2017-11-19
      • 2017-08-21
      • 1970-01-01
      • 2019-03-18
      • 2017-01-08
      相关资源
      最近更新 更多