一次性编码
One-hot encoding
我有一个这样的 csv 文件:
text short_text category
... ... ...
我已经打开文件并将其存储在 Pandas 数据框中,如下所示:
filepath = 'path/data.csv'
train = pd.read_csv(filepath, header=0, delimiter=",")
每条记录的类别字段包含一个类别列表,它是一个字符串,每个类别都用单引号引起来,如下所示:
['Adult' 'Aged' 'Aged 80 and over' 'Benzhydryl Compounds/*therapeutic use' 'Cresols/*therapeutic use' 'Double-Blind Method' 'Female' 'Humans' 'Male' 'Middle Aged' 'Muscarinic Antagonists/*therapeutic use' '*Phenylpropanolamine' 'Tolterodine Tartrate' 'Urinary Incontinence/*drug therapy']
我希望通过使用单热编码将其用于机器学习。我知道我可以使用 scikit-learn 的 sklearn.preprocessing 包来实现这一点,但我不确定该怎么做。
注意:我没有所有可能类别的列表。
你可以使用pd.value_counts
来帮助
df = pd.DataFrame(dict(
text=list('ABC'),
short_text=list('XYZ'),
category=[list('abc'), list('def'), list('abefxy')]
))
df.category.apply(pd.value_counts).fillna(0).astype(int)
或所有东西一起
pd.concat(
[df.drop('category', 1),
df.category.apply(pd.value_counts).fillna(0).astype(int)],
axis=1
)
作为 , you can use sklearn.preprocessing.MultiLabelBinarizer
的替代方法。
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.concat([
df.drop('category', 1),
pd.DataFrame(mlb.fit_transform(df['category']), columns=mlb.classes_),
], 1)
在我的测试中,这要快几个数量级,尤其是对于大型数据集。
我有一个这样的 csv 文件:
text short_text category
... ... ...
我已经打开文件并将其存储在 Pandas 数据框中,如下所示:
filepath = 'path/data.csv'
train = pd.read_csv(filepath, header=0, delimiter=",")
每条记录的类别字段包含一个类别列表,它是一个字符串,每个类别都用单引号引起来,如下所示:
['Adult' 'Aged' 'Aged 80 and over' 'Benzhydryl Compounds/*therapeutic use' 'Cresols/*therapeutic use' 'Double-Blind Method' 'Female' 'Humans' 'Male' 'Middle Aged' 'Muscarinic Antagonists/*therapeutic use' '*Phenylpropanolamine' 'Tolterodine Tartrate' 'Urinary Incontinence/*drug therapy']
我希望通过使用单热编码将其用于机器学习。我知道我可以使用 scikit-learn 的 sklearn.preprocessing 包来实现这一点,但我不确定该怎么做。
注意:我没有所有可能类别的列表。
你可以使用pd.value_counts
来帮助
df = pd.DataFrame(dict(
text=list('ABC'),
short_text=list('XYZ'),
category=[list('abc'), list('def'), list('abefxy')]
))
df.category.apply(pd.value_counts).fillna(0).astype(int)
或所有东西一起
pd.concat(
[df.drop('category', 1),
df.category.apply(pd.value_counts).fillna(0).astype(int)],
axis=1
)
作为 sklearn.preprocessing.MultiLabelBinarizer
的替代方法。
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.concat([
df.drop('category', 1),
pd.DataFrame(mlb.fit_transform(df['category']), columns=mlb.classes_),
], 1)
在我的测试中,这要快几个数量级,尤其是对于大型数据集。