从 Python 中不同类别的 n 长度数组编码分类数据
Encoding categorical data from n-length arrays of varying categories in Python
我目前仍处于理解机器学习的早期阶段(我是一名试图提高技能的网络程序员)并且 运行 遇到了基于 Kaggle 提供的数据集的问题。
这是一个数据集,其中每个特征包含 1..n 个标签,描述一顿饭的成分,以及这顿饭来自哪种菜系的目标领域。
Ingredients {ArrayOf<string>} | Cuisine {string}
[Tomato, Spaghetti, Beef, Basil, Oregano] | Italian
[Coriander Seeds, Cumin, Paprika, Chicken, Garlic, Ginger] | Indian
[Beef, Onion] | French
此数据经过程式化以说明数据描述方式的要点,成分是我的输入,美食是我的目标输出。
我想知道我的方法背后是否有正确的理论
- 在预处理中迭代数据帧的每个特征
- 获取所有成分并将它们添加到一个集合中
- 对于每种成分,将一个新列添加到以该成分命名的数据框中
- 遍历每个特征并根据每个成分将后续列设置为 1 或 0(即将 "Beef" 列设置为 1)
- 基于转换后的数据集训练模型
虽然这可能暂时有效,但可能无法扩展,因为我目前有 10,000 种独特的成分,将来还会有数万种。
我的想法是否正确,我是否应该考虑将来扩展功能?是否有任何内置功能支持我正在尝试做的事情?
使用:
vocab = set(j for i in df['Ingredients'] for j in i)
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(vocabulary=vocab, analyzer=lambda x: x)
X = cv.fit_transform(df['Ingredients'])
如果将 Ingredients {ArrayOf<string>}
列加载为 text
,则必须通过 -
转换为列表
df['Ingredients'] = df['Ingredients {ArrayOf<string>} '].apply(lambda x: [i.strip() for i in x.replace('[','').replace(']','').split(',')])
输出
X
将是您的输入矩阵 -
X.todense()
matrix([[1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
[0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]], dtype=int64)
对于词汇 -
cv.get_feature_names()
['Basil',
'Beef',
'Chicken',
'Coriander Seeds',
'Cumin',
'Garlic',
'Ginger',
'Onion',
'Oregano',
'Paprika',
'Spaghetti',
'Tomato']
我目前仍处于理解机器学习的早期阶段(我是一名试图提高技能的网络程序员)并且 运行 遇到了基于 Kaggle 提供的数据集的问题。
这是一个数据集,其中每个特征包含 1..n 个标签,描述一顿饭的成分,以及这顿饭来自哪种菜系的目标领域。
Ingredients {ArrayOf<string>} | Cuisine {string}
[Tomato, Spaghetti, Beef, Basil, Oregano] | Italian
[Coriander Seeds, Cumin, Paprika, Chicken, Garlic, Ginger] | Indian
[Beef, Onion] | French
此数据经过程式化以说明数据描述方式的要点,成分是我的输入,美食是我的目标输出。
我想知道我的方法背后是否有正确的理论
- 在预处理中迭代数据帧的每个特征
- 获取所有成分并将它们添加到一个集合中
- 对于每种成分,将一个新列添加到以该成分命名的数据框中
- 遍历每个特征并根据每个成分将后续列设置为 1 或 0(即将 "Beef" 列设置为 1)
- 基于转换后的数据集训练模型
虽然这可能暂时有效,但可能无法扩展,因为我目前有 10,000 种独特的成分,将来还会有数万种。
我的想法是否正确,我是否应该考虑将来扩展功能?是否有任何内置功能支持我正在尝试做的事情?
使用:
vocab = set(j for i in df['Ingredients'] for j in i)
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(vocabulary=vocab, analyzer=lambda x: x)
X = cv.fit_transform(df['Ingredients'])
如果将 Ingredients {ArrayOf<string>}
列加载为 text
,则必须通过 -
df['Ingredients'] = df['Ingredients {ArrayOf<string>} '].apply(lambda x: [i.strip() for i in x.replace('[','').replace(']','').split(',')])
输出
X
将是您的输入矩阵 -
X.todense()
matrix([[1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
[0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]], dtype=int64)
对于词汇 -
cv.get_feature_names()
['Basil',
'Beef',
'Chicken',
'Coriander Seeds',
'Cumin',
'Garlic',
'Ginger',
'Onion',
'Oregano',
'Paprika',
'Spaghetti',
'Tomato']