python scikit_利用Python,SciKit和文本分类进行行为分析

2023-05-16

python scikit

我们几乎所有人都购物。 我们购买各种各样的东西,从基本必需品(如食物)到娱乐产品(如音乐专辑)。 当我们购物时,我们不仅在生活中找到可用的东西,还表达了对某些社会群体的兴趣。 我们的在线行动和决策形成了我们的行为特征。

当我们购买产品时,该产品具有许多使其与其他产品相似或不同的属性。 例如,产品的价格,尺寸或类型就是区分属性的示例。 除了这些数字或枚举的结构化属性外,还有非结构化文本属性。 例如,产品说明或客户评论的文本也可以形成区别属性。

文本分析和其他自然语言处理(NLP)技术在从这些非结构化文本属性中提取含义方面非常有帮助,而这反过来又在诸如行为分析之类的任务中很有价值。

本文提供了有关如何使用文本分类构建行为档案模型的示例。 它显示了如何使用SciKit(基于Python的强大的机器学习包)进行模型构建和评估,以将该模型应用于模拟客户及其产品购买历史记录。 在这种特定情况下,您将构建一个模型,该模型为客户分配多个音乐监听器配置文件之一,例如raver,goth或metalhead。 分配基于每个客户购买的特定产品和相应的文本产品描述。

音乐行为档案场景

请考虑以下情形。 您有一个包含许多客户资料的数据集。 每个客户资料都包含客户购买的所有产品的基于自然语言的简短描述列表。 以下是引导的示例产品描述。

描述:铆钉头为工业,哥特和暗波亚文化群提供最新时尚,这种男士带扣长靴也不例外。 合成纤维人造皮革鞋面,鞋带正面饰有交叉扣细节,前排蕾丝正面,踩踏鞋底和格斗风格的鞋头,内侧拉链方便穿脱。 橡胶外底。 轴长13.5英寸,腿开口处的圆周长约16英寸。 (尺寸取自9.5尺寸。)样式:男士扣靴。

目标是根据这些产品描述将每个当前和将来的用户归类为几个行为配置文件之一。

如下所示,策展人使用产品示例来构建行为档案,行为模型,客户档案,最后是客户行为档案。

图1.建立客户行为档案的高级方法

第一步是承担策展人的角色,并向系统提供对每个行为特征的理解。 一种方法是手动为每个产品的示例播种系统。 这些示例有助于定义行为特征。 为了便于讨论,将用户分类为以下音乐行为特征之一:

  • 朋克
  • 哥德
  • 嘻哈
  • 金属
  • 好评如潮

举例说明被识别为朋克的产品,例如对朋克专辑和乐队的描述-例如,“性手枪”(Sex Pistols)的“ Never Mind the Bollocks”。 其他项目可能包括与发型或鞋类有关的产品,例如莫霍克族和Doc Marten靴子。

库,软件和数据设置

可以从JazzHub上的bpro项目下载本文中使用的所有数据和源代码。 下载并解压缩tar文件后,需要确保您具有Python, SciKit Learn (机器学习和文本分析包)以及所有依赖项(例如numpy,scipy等)。 如果您使用Mac, SciPy Superpack可能是您最好的选择。

解压缩tar文件后,您会注意到两个包含配置文件数据的YAML文件。 产品说明是通过获取种子语料库或文档主体人工生成的。 在生成过程中要注意产品描述中出现单词的频率。 清单1是一个人工产品说明。

注意:以下描述不是真正的自然语言描述,但是在实际情况下是这样。

清单1.人工产品描述
customer single clothes for his size them 1978 course group 
rhymes have master record-breaking group few starts heard 
blue ending company that the band the music packaged 
master kilmister not trousers got cult albums heart 
commentary cut 20.85 tour...

包括两个数据文件用于此分析:

  • customer.yaml —包含客户列表。 对于每个客户,都包括产品描述列表以及目标标签或正确的行为配置文件。 正确的行为特征是您知道正确的行为特征。 例如,在实际场景中,您检查了哥特用户的个人资料数据,以验证这些购买是否表明该用户是哥特人。
  • behavioral_profiles.yaml-包含配置文件列表(朋克,哥特等),以及定义该配置文件的一组产品描述示例。

您可以通过运行命令python bpro.py -g来生成自己的模拟文件。

注意:您必须首先使用定义感兴趣流派的内容填充种子目录。 进入种子目录并打开任何文件以获取说明。 您可以操纵bpro.py文件中的参数来更改产品说明的长度,噪音量,培训示例的数量或其他参数。

建立行为档案模型

首先使用SciKit的CountVectorizer基于术语计数的简单表示CountVectorizer 。 语料库对象是包含产品说明的简单字符串列表。

清单2.建立一个简单的术语计数
vectorizer = CountVectorizer(gmin_df=1)
    corpus=[]
    for bp in behavioral_profiles:
        for pd in bp.product_descriptions:
            corpus.append(pd.description)

SciKit还有其他更高级的矢量化程序,例如TFIDFVectorizer ,它使用术语频率/文档反向频率(TF / IDF)权重存储文档术语。 TF / IDF表示形式有助于加权诸如Ozzy , raver和Bauhaus之类的独特术语,比起经常出现的诸如and , the和for的术语更为重要。

接下来,将产品描述标记为单个单词并构建术语词典。 分析器在拟合过程中发现的每个项都将获得一个唯一的整数索引,该整数索引对应于结果矩阵中的一列:
fit_corpus = vectorizer.fit_transform(corpus)

注意:此标记生成器配置还会删除单个字符的单词。

您可以打印一些功能,以查看使用print vectorizer.get_feature_names()[200:210]标记的内容。 此命令提供以下输出。

清单3. print命令的输出
[u'better', u'between', u'beyond', u'biafra', u'big', 
u'bigger', u'bill',   u'billboard', u'bites', u'biting']

请注意,当前矢量化器没有词干。 词干处理是指获得变形词或派生词的通用基数或词根形式的过程。 例如,对于上一个列表中的“ 更大 ”一词,“ 大”是一个常见词干。 SciKit不处理更多涉及的标记化,例如词干,词根分离和复合拆分,但是您可以使用自定义标记化器,例如Natural Language Toolkit(NLTK)库中的标记化器。 请参阅scikit-learn.org以获取自定义标记程序的一个很好的示例。

诸如词干化之类的标记化过程有助于减少所需的训练示例的数量,因为单词的多种形式均不需要统计表示。 您可以使用其他技巧来减少培训需求,例如使用类型字典。 例如,如果您具有所有哥特乐队的乐队名称列表,则可以创建一个通用单词标记,例如goth_band ,并将其添加到描述中,然后生成特征。 使用这种方法,即使您在描述中第一次遇到某个频段,该模型也将按照处理其理解模式的其他频段的方式来处理它。 对于本文中的模拟数据,您不必担心减少培训需求,因此可以继续进行下一步。

在机器学习中,诸如此类的监督分类问题是通过首先定义一组特征和一组观察值的相应目标或正确标签而引起的。 然后,所选择的算法将尝试找到最适合该数据并最大程度减少针对已知数据集的错误的模型。 因此,下一步是构建特征和目标标签向量(请参见清单4)。 最好将随机化的观察结果以防验证技术不这样做。

清单4.构建特征和目标标签向量
data_target_tuples=[ ]
    for bp in behavioral_profiles:
        for pd in bp.product_descriptions:
            data_target_tuples.append((bp.type, pd.description))

    shuffle(data_target_tuples)

接下来,如清单5所示组装向量。

清单5.组装向量
X_data=[ ]
    y_target=[ ]
    for t in data_target_tuples:
        v = vectorizer.transform([t[1]]).toarray()[0]
        X_data.append(v)
        y_target.append(t[0])

    X_data=np.asarray(X_data)
    y_target=np.asarray(y_target)

现在您可以选择分类器并训练您的行为档案模型。 在这样做之前,最好对模型进行评估,以确保在对客户试用之前确保模型能够正常工作。

评估行为档案模型

首先使用线性支持向量机(SVM),它是解决此类稀疏向量问题的好模型。 使用代码linear_svm_classifier = SVC(kernel="linear", C=0.025)

注意:您可以通过仅更改此模型初始化代码来交换其他模型类型。 要使用不同的模型类型,可以使用此分类器映射,该映射为许多常用选项设置初始化。

清单6.使用分类器映射
classifier_map = dict()
classifier_map["Nearest Neighbors"]=KNeighborsClassifier(3)
classifier_map["Linear SVM"]=SVC(kernel="linear", C=0.025)
classifier_map["RBF SVM"]= SVC(gamma=2, C=1)
classifier_map["Decision Tree"]=DecisionTreeClassifier(max
    _depth=5)
classifier_map["Random Forest"]=RandomForestClassifier
    (max_depth=5, n_estimators=10, max_features=1)
classifier_map["AdaBoost"]=AdaBoostClassifier()
classifier_map["Naive Bayes"]=GaussianNB()
classifier_map["LDA"]=LDA()
classifier_map["QDA"]=QDA()

因为这是一个多类分类问题,也就是说,您需要在两个以上的可能类别之间进行选择,所以您还需要指定相应的策略。 一种常见的方法是执行“一分类” 与“全分类”。 例如,来自goth类的产品描述用于定义一个类,另一类包括来自所有其他类的示例描述,例如metalrave等。最后,作为验证的一部分,您需要确保该模型未针对正在测试的相同数据进行训练。 一种常见的技术是使用交叉折叠验证。 您使用五折,这意味着对五部分的数据分区进行了五遍。 在每一遍中,五分之四的数据用于训练,其余五分之一用于测试。

清单7.交叉验证
scores = cross_validation.cross_val_score(OneVsRestClassifier
    (linear_svm_classifier), X_data, y_target, cv=2)
print("Accuracy using %s: %0.2f (+/- %0.2f) and %d folds" 
    % ("Linear SVM", scores.mean(), scores.std() * 2, 5))

尽管如此,您仍可获得完美的精度,这表明模拟数据有点太完美了。 当然,在现实生活中,噪音会逐渐进入,因为组之间并不总是存在完美的界限。 例如,哥特朋克音乐风格存在问题,因此像Crimson Scarlet之类的乐队可能会进入gothpunk的训练示例。 您可以在bpro下载的软件包中处理种子数据,以更好地了解这种类型的噪声。

了解行为概况模型后,您可以循环回去并对其进行所有数据训练。

清单8.训练您的行为档案模型
behavioral_profiler = SVC(kernel="linear", C=0.025)
    behavioral_profiler.fit(X_data, y_target)

玩行为模型

现在,您可以键入一些虚构的产品描述,以了解模型的工作原理,从而对模型进行一些试验。

清单9.玩模型
print behavioral_profiler.predict(vectorizer.transform(['Some black 
Bauhaus shoes to go with your Joy Division hand bag']).toarray()[0])

注意,确实确实返回['goth'] 。 如果删除单词Bauhaus并重新运行,您会注意到它现在返回['punk']

将行为模型应用于客户

继续对客户及其购买的产品说明应用经过训练的模型。

清单10.将训练有素的模型应用于我们的客户及其产品描述
predicted_profiles=[ ]
ground_truth=[ ]
for c in customers:
    customer_prod_descs = ' '.join(p.description for p in 
c.product_descriptions)
    predicted =   behavioral_profiler.predict(vectorizer
.transform([customer_product_descriptions]).toarray()[0])
    predicted_profiles.append(predicted[0])
    ground_truth.append(c.type)
    print "Customer %d, known to be %s, was predicted to 
be %s" % (c.id,c.type,predicted[0])

最后,计算准确性以查看您能够多久描述一次购物者。

清单11.计算准确性
a=[x1==y1 for x1, y1 in zip(predicted_profiles,ground_truth)]
    accuracy=float(sum(a))/len(a)
    print "Percent Profiled Correctly %.2f" % accuracy

提供的默认配置文件数据的结果应为95%。 如果这是真实数据,那将是一个相当不错的准确率。

放大模型

现在,您已经构建并测试了模型,现在可以在数百万的客户资料中使用它了。 您可以使用MapReduce框架并将经过培训的行为分析器发送到工作程序节点上。 然后,每个工作人员节点都会获得一批具有购买历史记录的客户资料,并应用该模型。 保存结果。 至此,已经应用了模型,并且已将您的客户分配给了行为配置文件。 您可以通过多种方式使用配置文件分配。 例如,您可能决定针对目标客户进行量身定制的促销活动,或者将配置文件用作产品推荐系统的输入。

翻译自: https://www.ibm.com/developerworks/opensource/library/bd-natural-language/index.html

python scikit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python scikit_利用Python,SciKit和文本分类进行行为分析 的相关文章

随机推荐