当我们进行机器学习时,无正确分类标签或根本就没有标签的时候,就需要用到无监督学习方法了。
无监督,就是没有标签来监督了,根据数据表现,将数据进行分类,至于分类后的解释,就需要你来寻找了,或者根本就无路可寻,呵呵~。。。
废话少说,开始上菜:
1、KMeans
1)KMeans是聚类经常用的方法,适用于凸函数,例如这样的图形:
这样的:
后面的几乎就一类了 ,看图好像没什么可分的哈。。。
2)KMeans参数:
sklearn.cluster.KMeans(n_clusters=8,
init=‘k-means++’,
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances=‘auto’,
verbose=0,
random_state=None,
copy_x=True,
n_jobs=1,
algorithm=‘auto’
)
参数的意义:
n_clusters:簇的个数,即你想聚成几类
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。
max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式实现
PS:参数部分是我引用的,百度一下,可以看到一大堆解释,不做详细介绍。
3)下面就是模型训练了,直接 引用sklearn里的模块:
k = 4 #聚类的类别,必须指定,是KMean的缺点之一
from sklearn.cluster import KMeans
model = KMeans(n_clusters = k,init='k-means++', max_iter = 20000)
model.fit(X_train) #开始聚类
label = pd.Series(model.labels_)#获取标签,有时候格式会有问题,这里我转换为了Series,方便后期指标的评估
y_pre=model.predict(X_test)#为测试集进行预测
是不是很简单
4)指标评估:
轮廓系数:
score_scaled = metrics.silhouette_score(X_train,label)#越大说明效果越好
print("轮廓系数",score_scaled)
若你有正确的分类,还可以看看聚类训练的分类结果和真实分类之间的差距:
def Index_model(y_train,label):
'''
兰德指数
'''
ARI=metrics.adjusted_rand_score(y_train, label) #越大,聚类结果越吻合
print("兰德指数:",ARI)
'''
互信息
'''
AMI=metrics.adjusted_mutual_info_score(y_train, label)
print("互信息",AMI)#越大越吻合
'''
同质性homogeneity
'''
ho=metrics.homogeneity_score(y_train, label)
print("同质性homogeneity",ho)
'''
完整性completeness
'''
co=metrics.completeness_score(y_train, label)
print("完整性completeness",co)
'''
前面两者的调和平均V-measure
'''
Vm=metrics.v_measure_score(y_train, label)
print("同质和完整性的调和平均",Vm)
'''
Fowlkes-Mallows scores
'''
FMS=metrics.fowlkes_mallows_score(y_train, label)
print("Fowlkes-Mallows scores",FMS)
今天就写到这,有时间更新其他聚类方法,对你有用的话,记得赞一下哦