余弦相似度算法进行客户流失分类预测

这篇具有很好参考价值的文章主要介绍了余弦相似度算法进行客户流失分类预测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

余弦相似性是一种用于计算两个向量之间相似度的方法,常被用于文本分类和信息检索领域。具体来说,假设有两个向量A和B,它们的余弦相似度可以通过以下公式计算:

余弦相似度算法进行客户流失分类预测

其中,dot_product(A, B)表示向量A和B的点积,norm(A)和norm(B)分别表示向量A和B的范数。如果A和B越相似,它们的余弦相似度就越接近1,反之亦然。

余弦相似度算法进行客户流失分类预测

数据集

我们这里用的演示数据集来自一个datacamp:

这个数据集来自一家伊朗电信公司,每一行代表一个客户一年的时间。除了客户流失标签,还有客户活动的信息,比如呼叫失败和订阅时长等等。我们最后要预测的是这个客户是否流失,也就是一个二元分类的问题。

数据集如下:

 import pandas as pd
 df = pd.read_csv("data/customer_churn.csv")
 

余弦相似度算法进行客户流失分类预测

我们先区分训练和验证集:

 from sklearn.model_selection import train_test_split
 
 # split the dataframe into 70% training and 30% testing sets
 train_df, test_df = train_test_split(df, test_size=0.3)

SVM

为了进行对比,我们先使用SVM做一个基础模型

 fromsklearn.svmimportSVC
 fromsklearn.metricsimportclassification_report, confusion_matrix
 
 # define the range of C and gamma values to try
 c_values= [0.1, 1, 10, 100]
 gamma_values= [0.1, 1, 10, 100]
 
 # initialize variables to store the best result
 best_accuracy=0
 best_c=None
 best_gamma=None
 best_predictions=None
 
 # loop over the different combinations of C and gamma values
 forcinc_values:
     forgammaingamma_values:
         # initialize the SVM classifier with RBF kernel, C, and gamma
         clf=SVC(kernel='rbf', C=c, gamma=gamma, random_state=42)
 
         # fit the classifier on the training set
         clf.fit(train_df.drop('Churn', axis=1), train_df['Churn'])
 
         # predict the target variable of the test set
         y_pred=clf.predict(test_df.drop('Churn', axis=1))
 
         # calculate accuracy and store the result if it's the best so far
         accuracy=clf.score(test_df.drop('Churn', axis=1), test_df['Churn'])
         ifaccuracy>best_accuracy:
             best_accuracy=accuracy
             best_c=c
             best_gamma=gamma
             best_predictions=y_pred
 
 # print the best result and the confusion matrix
 print(f"Best result: C={best_c}, gamma={best_gamma}, accuracy={best_accuracy:.2f}")
 print("Confusion matrix:")
 print(confusion_matrix(test_df['Churn'], best_predictions))

余弦相似度算法进行客户流失分类预测

可以看到支持向量机得到了87%的准确率,并且很好地预测了客户流失。

余弦相似度算法

这段代码使用训练数据集来计算类之间的余弦相似度。

 importpandasaspd
 fromsklearn.metrics.pairwiseimportcosine_similarity
 
 # calculate the cosine similarity matrix between all rows of the dataframe
 cosine_sim=cosine_similarity(train_df.drop('Churn', axis=1))
 
 # create a dataframe from the cosine similarity matrix
 cosine_sim_df=pd.DataFrame(cosine_sim, index=train_df.index, columns=train_df.index)
 
 # create a copy of the train_df dataframe without the churn column
 train_df_no_churn=train_df.drop('Churn', axis=1)
 
 # calculate the mean cosine similarity for class 0 vs. class 0
 class0_cosine_sim_0=cosine_sim_df.loc[train_df[train_df['Churn'] ==0].index, train_df[train_df['Churn'] ==0].index].mean().mean()
 
 # calculate the mean cosine similarity for class 0 vs. class 1
 class0_cosine_sim_1=cosine_sim_df.loc[train_df[train_df['Churn'] ==0].index, train_df[train_df['Churn'] ==1].index].mean().mean()
 
 # calculate the mean cosine similarity for class 1 vs. class 1
 class1_cosine_sim_1=cosine_sim_df.loc[train_df[train_df['Churn'] ==1].index, train_df[train_df['Churn'] ==1].index].mean().mean()
 
 # display the mean cosine similarities for each pair of classes
 print('Mean cosine similarity (class 0 vs. class 0):', class0_cosine_sim_0)
 print('Mean cosine similarity (class 0 vs. class 1):', class0_cosine_sim_1)
 print('Mean cosine similarity (class 1 vs. class 1):', class1_cosine_sim_1)

下面是它们的余弦相似度:

余弦相似度算法进行客户流失分类预测

然后我们生成一个DF

 importpandasaspd
 
 # create a dictionary with the mean and standard deviation values for each comparison
 data= {
     'comparison': ['Class 0 vs. Class 0', 'Class 0 vs. Class 1', 'Class 1 vs. Class 1'],
     'similarity_mean': [class0_cosine_sim_0, class0_cosine_sim_1, class1_cosine_sim_1],
 }
 
 # create a Pandas DataFrame from the dictionary
 df=pd.DataFrame(data)
 
 df=df.set_index('comparison').T
 
 
 # print the resulting DataFrame
 print(df)

余弦相似度算法进行客户流失分类预测

下面就是把这个算法应用到训练数据集上。我取在训练集上创建一个sample_churn_0,其中包含10个样本以的距离。

 # create a DataFrame containing a random sample of 10 points where Churn is 0
 sample_churn_0=train_df[train_df['Churn'] ==0].sample(n=10)

然后将它交叉连接到test_df。这将使test_df扩充为10倍的行数,因为每个测试记录的右侧有10个示例记录。

 importpandasaspd
 
 # assume test_df and sample_churn_0 are your dataframes
 
 # add a column to both dataframes with a common value to join on
 test_df['join_col'] =1
 sample_churn_0['join_col'] =1
 
 # perform the cross-join using merge()
 result_df=pd.merge(test_df, sample_churn_0, on='join_col')
 
 # drop the join_col column from the result dataframe
 result_df=result_df.drop('join_col', axis=1)

现在我们对交叉连接DF的左侧和右侧进行余弦相似性比较。

 importpandasaspd
 fromsklearn.metrics.pairwiseimportcosine_similarity
 
 # Extract the "_x" and "_y" columns from the result_df DataFrame, excluding the "Churn_x" and "Churn_y" columns
 df_x=result_df[[colforcolinresult_df.columnsifcol.endswith('_x') andnotcol.startswith('Churn_')]]
 df_y=result_df[[colforcolinresult_df.columnsifcol.endswith('_y') andnotcol.startswith('Churn_')]]
 
 # Calculate the cosine similarities between the two sets of vectors on each row
 cosine_sims= []
 foriinrange(len(df_x)):
     cos_sim=cosine_similarity([df_x.iloc[i]], [df_y.iloc[i]])[0][0]
     cosine_sims.append(cos_sim)
 
 # Add the cosine similarity values as a new column in the result_df DataFrame
 result_df['cos_sim'] =cosine_sims

然后用下面的代码提取所有的列名:

 x_col_names = [col for col in result_df.columns if col.endswith('_x')]

这样我们就可以进行分组并获得每个test_df记录的平均余弦相似度(目前重复10次),然后在grouped_df中,我们将其重命名为x_col_names:

 grouped_df = result_df.groupby(result_df.columns[:14].tolist()).agg({'cos_sim': 'mean'})
 
 grouped_df = grouped_df.rename_axis(x_col_names).reset_index()
 
 grouped_df.head()

最后我们计算这10个样本的平均余弦相似度。

在上面步骤中,我们计算的分类相似度的df是这个:

余弦相似度算法进行客户流失分类预测

我们就使用这个数值作为分类的参考。首先,我们需要将其交叉连接到grouped_df(与test_df相同,但具有平均余弦相似度):

 cross_df = grouped_df.merge(df, how='cross')
 cross_df = cross_df.iloc[:, :-1]

结果如下:

余弦相似度算法进行客户流失分类预测

最后我们得到了3列:Class 0 vs. Class 0, and Class 0 vs. Class 1,然后我们需要得到类之间的差别:

 cross_df['diff_0'] = abs(cross_df['cos_sim'] - df['Class 0 vs. Class 0'].iloc[0])
 cross_df['diff_1'] = abs(cross_df['cos_sim'] - df['Class 0 vs. Class 1'].iloc[0])

预测的代码如下:

 # Add a new column 'predicted_churn'
 cross_df['predicted_churn'] = ''
 
 # Loop through each row and check the minimum difference
 for idx, row in cross_df.iterrows():
     if row['diff_0'] < row['diff_1']:
         cross_df.at[idx, 'predicted_churn'] = 0
     else:
         cross_df.at[idx, 'predicted_churn'] = 1

最后我们看看结果:

 grouped_df__2 = cross_df.groupby(['predicted_churn', 'Churn_x']).size().reset_index(name='count')
 grouped_df__2['percentage'] = grouped_df__2['count'] / grouped_df__2['count'].sum() * 100
 
 grouped_df__2.head()

余弦相似度算法进行客户流失分类预测

可以看到,模型的准确率为84.25%。但是我们可以看到,他的混淆矩阵看到对于某些预测要比svm好,也就是说它可以在一定程度上解决类别不平衡的问题。

总结

余弦相似性本身并不能直接解决类别不平衡的问题,因为它只是一种计算相似度的方法,而不是一个分类器。但是,余弦相似性可以作为特征表示方法,来提高类别不平衡数据集的分类性能。本文只是作为一个样例还有可以提高的空间。

本文的数据集在这里:

https://avoid.overfit.cn/post/5cd4d22b523c418cb5d716e942a7ed46

如果你有兴趣可以自行尝试。

作者:Ashutosh Malgaonkar文章来源地址https://www.toymoban.com/news/detail-441105.html

到了这里,关于余弦相似度算法进行客户流失分类预测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习:基于Kmeans聚类算法对银行客户进行分类

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 大家好,我

    2024年02月05日
    浏览(53)
  • 基于Pandas+余弦相似度+大数据智能护肤品推荐系统——机器学习算法应用(含Python工程源码)+数据集

    本项目结合了Pandas数据处理工具和机器学习技术,旨在构建一个智能的护肤品推荐系统。该系统不仅会考虑用户的肤质特征,还会考虑过敏反应等因素,并筛选出相互禁忌的产品,以便为不确定如何选择护肤品的用户提供个性化的推荐。 首先,项目会收集用户的肤质信息,包

    2024年02月07日
    浏览(34)
  • java文本相似度【余弦相似度】

    为了实现文本相似度对比,我们可以使用余弦相似度算法。首先,我们需要将文本转换为向量,然后计算两个向量之间的余弦相似度。以下是一个简单的Java实现: 这个代码示例首先定义了一个 TextSimilarity 类,其中包含一个 main 方法用于测试文本相似度计算。 calculateCosineSi

    2024年02月10日
    浏览(40)
  • OpenCV书签 #余弦相似度的原理与相似图片/相似文件搜索实验

    余弦相似度(Cosine Similarity) ,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度仅仅与向量的指向方向相关,与向量的长度无关,它将向量根据坐标值绘制到向量空间中,如最常见的二维空间。因此,万物皆向量,我们可以使用余弦相

    2024年01月24日
    浏览(48)
  • Elasticsearch:什么是余弦相似度?

    余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用,那么你来对地方了。 本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后,你将能够

    2024年02月03日
    浏览(40)
  • 计算两个向量的余弦相似度

    余弦相似度是判断两个向量相似度常用的算法,我在做行人重识别的时候,用到了余弦相似度的算法,记录一下。 余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于

    2024年02月03日
    浏览(46)
  • 【MATLAB第50期】基于MATLAB的RELM-LOO多输入单输出回归&分类预测算法与RELM及ELM进行对比

    RELM-LOO即通过LOO计算效率方法对其RELM模型正则化C系数进行寻优。 对于进化算法寻优来说, 结果更稳定。 可参考以下文献: [1] Shao Z , Er M J , Wang N .An effective semi-cross-validation model selection method for extreme learning machine with ridge regression[J].Neurocomputing, 2015, 151:933-942.DOI:10.1016/j.neucom

    2024年02月12日
    浏览(38)
  • Python文本分析 | 余弦相似度的计算

    本文首发于微信公众号:Python for Finance 链接:https://mp.weixin.qq.com/s/i74pct7a4NBRSN39kg2NXA 余弦相似性通过计算两个向量的余弦角来测量两个向量之间的相似性。 D1 = ‘the best data science course’ D2 = ‘data science is popular’ 基于词袋法构造文本向量: D1:[1,1,1,1,1,0,0] D2:[0,

    2023年04月11日
    浏览(43)
  • 【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)

    Faiss 是一个强大的向量相似度搜索库,具有以下优点: 高效的搜索性能:Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索引结构和近似搜索算法,可以快速地执行最近邻搜索和相似度匹配,具有很低的查询延迟。 高度可扩展:Faiss 提供了多种索引结构和算法

    2024年02月07日
    浏览(51)
  • pytorch一行实现:计算同一tensor矩阵内每行之间的余弦相似度

      余弦相似度的公式如下所示:   可以使用torch自带的余弦相似度计算函数(下面三种用哪一个都可以,效果是一样的):   该函数原文档在:torch官方文档    cosine_similarity中的参数要两个tensor数据,而我们的需求是求一个tensor内的行与行之间的余弦相似度。很显然

    2023年04月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包