【问题标题】:Convert categorical data into numerical data in Python在 Python 中将分类数据转换为数值数据
【发布时间】:2019-10-07 13:02:51
【问题描述】:

我有一个数据集。其中一列 - “关键字” - 包含分类数据。我尝试使用的机器学习算法只需要数字数据。我想将“关键字”列转换为数值 - 我该怎么做?使用自然语言处理?字包?

我尝试了以下方法,但得到了ValueError: Expected 2D array, got 1D array instead

from sklearn.feature_extraction.text import CountVectorizer
count_vector = CountVectorizer()
dataset['Keyword'] = count_vector.fit_transform(dataset['Keyword'])
from sklearn.model_selection import train_test_split
y=dataset['C']
x=dataset(['Keyword','A','B'])
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
from sklearn.linear_model import LinearRegression
regressor=LinearRegression()
regressor.fit(x_train,y_train)

【问题讨论】:

    标签: python machine-learning encoding nlp categorical-data


    【解决方案1】:

    您可能想要使用编码器。最常用和最受欢迎的之一是LabelEncoderOneHotEncoder。两者都作为sklearn 库的一部分提供。

    LabelEncoder可用于将分类数据转换为整数:

    from sklearn.preprocessing import LabelEncoder
    label_encoder = LabelEncoder()
    x = ['Apple', 'Orange', 'Apple', 'Pear']
    y = label_encoder.fit_transform(x)
    print(y)
    
    array([0, 1, 0, 2])
    

    这会将 ['Apple', 'Orange', 'Apple', 'Pear'] 列表转换为 [0, 1, 0, 2] ,每个整数对应一个项目。这对于 ML 来说并不总是理想的,因为整数具有不同的数值,这表明一个大于另一个,例如 Pear > Apple,情况并非如此。为了不引入此类问题,您需要使用 OneHotEncoder。

    OneHotEncoder 可用于将分类数据转换为一个热编码数组。使用 OneHotEncoder 对先前定义的 y 进行编码会导致:

    from numpy import array
    from numpy import argmax
    from sklearn.preprocessing import OneHotEncoder
    onehot_encoder = OneHotEncoder(sparse=False)
    y = y.reshape(len(y), 1)
    onehot_encoded = onehot_encoder.fit_transform(y)
    print(onehot_encoded)
    
    [[1. 0. 0.]
    [0. 1. 0.]
    [1. 0. 0.]
    [0. 0. 1.]]
    

    x 的每个元素变成一个零数组,只有一个 1 编码元素的类别。

    关于如何在 DataFrame can be found here 上使用它的简单教程。

    【讨论】:

    • 感谢您的快速回复!但我的“关键字”列包含一组单词。例如“HTML 语言”..
    • @user3359964 我不确定我是否理解。你能用“关键字”的确切定义来扩展你的问题吗?您的意思是在该列下的每一行上都有一个由空格分隔的多个单词的字符串吗?或者该列下的每个项目都是一个字符串列表?
    • 对不起.. 是的,'Keyword' 列的每一行都包含一个字符串,其中多个单词用空格分隔。
    • 索引关键字 1 HTML 语言 2 数学教程
    • @user3359964 我明白了。那么,这取决于您如何设想所需的编码。您想要输出是什么样的?每个唯一字符串的不同类别?或者在创建类别时只考虑该字符串中的第一个空格分隔的单词?这一切都取决于你想做什么。也许如果该字符串中的每个单词都是有意义的,它应该真正分成自己的列,例如。 Subject, Type 这样“HTML”和“数学”将在Subject 下,“语言”和“教程”在Type 下。然后按照我的答案对这两列进行编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多