在本文中,将探讨混合数据类型的自动化多类别分类问题。以文本分类为例,有大量文本和目标标签。基于输入的文本,创建一个模型来学习目标标签,并最终预测目标标签。通常,会执行所有自然语言处理步骤,如分词等,以对目标值进行分类。但在现实世界的数据中,除了文本数据外,有时还会有一些连续变量或分类变量。例如,考虑一个呼叫中心,有客户语音转文本的模型,并且正在尝试分类句子是积极的还是消极的。在这里,除了文本数据外,可能还会有关于客户与呼叫中心代理通话时间的信息,客户从一位代理转移到另一位代理的次数等。这些因素也会影响识别客户是否与代理有积极的互动或消极的互动。在这里,将处理并分类这类数据。
在这里,将使用AutoViML,这是一个用于自动化机器学习的包。它可以通过以下命令安装:
pip install autoviml
还使用了TensorFlow数据集,特别是亚马逊个人护理电器数据集。还使用了其他Python库,如NumPy和Pandas。
让导入这些库:
import tensorflow_datasets as tfds
import numpy as np
import pandas as pd
接下来,从TensorFlow数据集中加载数据集,并将其分配给变量dataset。info变量是关于数据集的元数据。接下来,将训练数据集加载到train_dataset中。
dataset, info = tfds.load('amazon_us_reviews/Personal_Care_Appliances_v1_00', with_info=True, batch_size=-1)
train_dataset = dataset['train']
现在,让打印info。它列出了数据集中的所有列及其数据类型。接下来,将数据集转换为NumPy数组。
dataset = tfds.as_numpy(train_dataset)
如果打印dataset输出,可以看到一些初始行,因为它是一个NumPy数组。现在,选择了一些特定的列,包括连续值和分类值的组合以及一个文本列。
verified_purchase = dataset['data']['verified_purchase']
helpful_votes = dataset['data']['helpful_votes']
review_headline = dataset['data']['review_headline']
review_body = dataset['data']['review_body']
rating = dataset['data']['star_rating']
接下来,将这些变量全部转换为Pandas数据框。
reviews_df = pd.DataFrame(np.hstack((verified_purchase[:, None], helpful_votes[:, None], review_headline[:, None], review_body[:, None], rating[:, None])), columns=['verified', 'votes', 'headline', 'reviews', 'rating'])
现在,声明列的数据类型。
convert_dict = {
'verified': int,
'votes': int,
'headline': str,
'reviews': str,
'rating': int
}
reviews_df = reviews_df.astype(convert_dict)
可以看到输出。有verified列显示是否为验证购买。投票是给评论的,评论的标题,评论的正文,然后是1到5的评分。
现在,将创建一个多类别分类。与将评论转换为积极或消极不同,将它们转换为积极、消极和中立。为此,创建了一个函数。在这个函数中,如果评分小于或等于2,将其视为消极评论。如果评分等于3,则视为中立评论。评分高于3则是积极评论。
def convert_rating(rating):
if rating <= 2:
out = 0
elif rating == 3:
out = 1
else:
out = 2
return out
现在,创建了一个目标变量。取reviews_df的目标,然后使用评分列通过应用一个lambda函数来调用这个函数。
reviews_df["target"] = reviews_df["rating"].apply(lambda x: convert_rating(x))
数据框的形状是:
reviews_df.shape[0]
目标值的计数是:
reviews_df["target"].value_counts()
在这个不平衡的数据集中,大多数评论是积极的。一些评论是消极的,很少有中立的。在这里,中立值没有被正确预测。原因是当人们为评分写3时,他们对评论感到满意,而词汇会重叠。
让看看模型的表现。Auto ML只是对建模技术的表现有一个直观的理解。它不会给一个调整和部署的完美模型。它用于对模型的输出有一个初步的理解,然后可以进一步微调和应用。
现在,将删除评分列,因为不需要在已经创建的目标中包含评分列。如果保留评分列并将其传递给模型,它可能只是一个学习和映射目标变量的函数。
reviews_df = reviews_df.drop('rating', axis=1)
现在,将数据集分割为75-25。即75%进入训练集,25%进入测试集。
from sklearn.model_selection import train_test_split
train, test = train_test_split(reviews_df, test_size=0.25)
之后,导入AutoViML包。
from autoviml.Auto_ViML import Auto_ViML
将目标变量定义为目标。
target = 'target'
调用AutoViML函数。在这里,传递训练数据框和测试数据框以及目标变量。
m, feats, trainm, testm = Auto_ViML(train, target, test,
sample_submission='',
scoring_parameter='',
KMeans_Featurizer=False,
hyper_param='RS', feature_reduction=True,
Boosting_Flag='CatBoost', Binning_Flag=False,
Add_Poly=0, Stacking_Flag=False, Imbalanced_Flag=False,
verbose=2)
现在训练完成了。它给出了评论列中单词的分布。它尝试了不同的组合。首先,它尝试了计数向量化器,然后是TFIDF向量化器,带和不带二进制。然后它选择了最佳的一种(计数向量化器),这对特定模型有效。它还给出了每个变量的ROC曲线。它还给出了特征重要性。正如之前所说,这不是最终模型。它只是给出了模型表现的一个想法。可以使用创建的特征和技术,然后可以进一步进行特征工程。接下来,让打印feats。它将给出所有使用的特征。
feats
可以看到各种被视为特征的文本。接下来,让看看测试框架。
testm
它打印出所有特征,最后是使用的不同模型以及目标列,基于测试数据的预测。现在,可以保存模型。
m.save_model('model', format='cbm')
m.predict(testm[feats])
from autoviml.Auto_NLP import plot_confusion_matrix, plot_classification_matrix
plot_confusion_matrix(test[target].values, m.predict(testm[feats]))