内容简介:(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )前面我们学习过监督学习模型的性能评估,由于数据集有标记,所以我们可以将模型预测值和真实的标记做比较,计算两者之间的差异,从而来评估监督学习模型的好坏。但是,对于无监督学习模型,由于没有标记数据,我们该怎么样评估一个模型的好坏了?显然,此时我们不能采用和监督学习模型一样的评估方式了,而要另辟蹊径。
(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
前面我们学习过监督学习模型的性能评估,由于数据集有标记,所以我们可以将模型预测值和真实的标记做比较,计算两者之间的差异,从而来评估监督学习模型的好坏。
但是,对于无监督学习模型,由于没有标记数据,我们该怎么样评估一个模型的好坏了?显然,此时我们不能采用和监督学习模型一样的评估方式了,而要另辟蹊径。
1. 度量聚类模型的好坏---轮廓系数
有很多种度量聚类模型的算法,其中一个比较好用的算法就是轮廓系数(Silhouette Coefficient)指标。这个指标度量模型将数据集分类的离散程度,即判断数据集是否分离的合理,判断一个集群中的数据点是不是足够紧密(即内聚度),一个集群中的点和其他集群中的点相隔是否足够远(即分离度),故而轮廓系数结合了内聚度和分离度这两种因素,可以用来在相同原始数据的基础上用来评价不同算法,或者算法不同运行方式对聚类结果所产生的影响。
以下是百度对轮廓系数的说明,此处我直接搬过来用了。
2. 使用轮廓系数评估K-means模型
首先是用pandas加载数据集,查看数据集加载是否正确,这部分可以看我的 具体代码 ,此处省略。
然后我随机的构建一个K-means模型,用这个模型来训练数据集,并用轮廓系数来评估该模型的优虐,代码如下:
from sklearn.cluster import KMeans # 构建一个聚类模型,此处用K-means算法 model=KMeans(init='k-means++',n_clusters=3,n_init=10) # 原始K-means算法最开始随机选取数据集中K个点作为聚类中心, # 分类结果会因为初始点的选取不同而有所区别 # 而K-means++算法改变这种随机选取方法,能显著的改善分类结果的最终误差 # 此处我随机的指定n_cluster=3,看看评估结果 model.fit(dataset) 复制代码
# 使用轮廓系数评估模型的优虐 from sklearn.metrics import silhouette_score si_score=silhouette_score(dataset,model.labels_, metric='euclidean',sample_size=len(dataset)) print('si_score: {:.4f}'.format(si_score)) 复制代码
-------------------------------------输---------出--------------------------------
si_score: 0.5572
--------------------------------------------完-------------------------------------
从上面的代码可以看出,计算轮廓系数是非常简单的。
########################小**********结###############################
1, sklearn中已经集成了轮廓系数的计算方法,我们只需要调用该函数即可,使用非常简单。
2, 有了模型的评估指标,我们就可以对模型进行一些优化,提升模型的性能,或者用该指标来比较两个不同模型在相同数据集上的效果,从而为我们选择模型提供指导。
#################################################################
3. K-means模型性能的提升方法
上面在评价K-means模型时,我们随机指定了划分的族群数量,即K值,但是有了评估指标之后,我们就可以优化这个K值,其基本思路是:遍历各种可能的K值,计算每种K值之下的轮廓系数,选择轮廓系数最大的K值,即为最优的族群数量。
下面我先定义一个函数,专门用来计算K-means算法的最优K值,这个函数具有一定的通用性,也可以用于其它场合。如下为代码:
# K-means模型的提升 # 在定义K-means时,往往我们很难知道最优的簇群数量,即K值, # 故而可以通过遍历得到最优值 def get_optimal_K(dataset,K_list=None): k_lists=K_list if K_list else range(2,15) scores=[] for k in k_lists: kmeans=KMeans(init='k-means++',n_clusters=k,n_init=10) kmeans.fit(dataset) scores.append(silhouette_score(dataset,kmeans.labels_, metric='euclidean', sample_size=len(dataset))) return k_lists[scores.index(max(scores))],scores 复制代码
有了这个通用性求解最优K值的函数,我们就可以用来获取这个数据集的最佳K值,如下为代码:
optimal_K, scores=get_optimal_K(dataset) print('optimal_K is: {}, all scores: {}'.format(optimal_K,scores)) # or: # optimal_K, scores=get_optimal_K(dataset,[2,4,6,8,10,12]) # print('optimal_K is: {}, all scores: {}'.format(optimal_K,scores)) 复制代码
-------------------------------------输---------出--------------------------------
optimal_K is: 5, all scores: [0.5290397175472954, 0.5551898802099927, 0.5832757517829593, 0.6582796909760834, 0.5823584119482567, 0.5238070812131604, 0.4674788136779971, 0.38754867890367795, 0.41013511008667664, 0.41972398760085106, 0.41614459998617975, 0.3485105795903397, 0.357222732243728]
--------------------------------------------完-------------------------------------
从上面的结果可以看出,函数计算出来的最优K值为5,即最好的情况是将本数据集划分为5个类别,且在K=5时的轮廓系数为0.6583。
下面我们来看一下这个数据集在平面上的分布情况,看看是不是数据集有5种类别,如下所示是使用visual_2D_dataset()函数之后得到的平面分布图。
从上图中可以看出,的确数据集中到五个不同的簇群中。那么用最优的参数来聚类这些数据集,得到什么样的效果了?如下是平面的聚类效果图。
########################小**********结###############################
1, 使用轮廓系数可以对模型进行参数优化,此处我们定义了一个通用性函数,可以直接计算出数据集的最佳K值。
2, 当然,也可以用轮廓系数来优化其他参数,只要稍微修改一下上面的通用函数即可。
#################################################################
注:本部分代码已经全部上传到( 我的github )上,欢迎下载。
参考资料:
1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【火炉炼AI】机器学习033-构建电影推荐系统
- 【火炉炼AI】机器学习036-NLP词形还原
- 【火炉炼AI】机器学习035-NLP词干提取
- 【火炉炼AI】机器学习037-NLP文本分块
- 【火炉炼AI】机器学习039-NLP文本分类器
- 【火炉炼AI】机器学习041-NLP句子情感分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
电商运营之道:策略、方法与实践
吴伟定、姚金刚、周振兴、郑琰 / 机械工业出版社 / 2015-9-1 / 49
电商运营之道:策略、方法与实践是一本电商的运营指南,适合所有的电商从业人员阅读,也适合打算进入或打算在电商行业创业的读者朋友阅读。分别从策略、方法与实践三个方面全景式展示电商运营的内在商业规律与管理逻辑。一起来看看 《电商运营之道:策略、方法与实践》 这本书的介绍吧!