无监督学习PCA降维处理和K-means聚类

1、无监督学习

没有目标值(变量)的算法

常见的无监督学习算法:

降维:

– 主成分分析PCA降维处理

聚类:

– K-means(k均值聚类)

2、主成分分析

应用PCA实现特征的降维

·定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量

·作用:是数据维散压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

·应用:回归分析或者聚类分析当中

PCA的APA:

·sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间

  • n_components:
    ·小数:表示保留百分之多少的信息
    ·整数:减少到多少特征变量
  • PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后指定维度的array
'''#构造一组特征值数据'''
import numpy as np
import pandas as dp
from scipy import stats

np.random.seed(10) # 先生成一个种子生成器,以后生成的随机数就是一样的,参数为任意数字
x1 = stats.norm.rvs(loc=5,scale=0.0,size=500) #均值为5,标准差为0.0的正态分布,随机随机生成500个样本
x2 = stats.t.rvs(10, size=500) #生成服从t分布,自由度为10的500个随机数(rvs生成随机数)
x3 = stats.norm.rvs(loc=1,scale=0.5,size=500) #均值为1,标准差为0.5的正态分布,随机随机生成500个样本
x4 = np.random.rand(500)
x5 = 10*x4+5 + stats.norm.rvs(loc=0,scale=0.0,size=500)  #stats.norm.rvs(loc=0,scale=0.0,size=500)用来构造残差
x6 = -5*x2 +1 + stats.norm.rvs(loc=0,scale=0.0,size=500)
#暂时不构造目标值y
data = pd.DataFrame({"x1":x1,"x2":x2,"x3":x3,"x4":x4,"x5":x5,"x6":x6})
display(data.sample(5))


'''# 主成分分析,保留n.n% 的信息'''
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np

#2.实例化一个转换器类
transfer = PCA(n_components=0.9) #实例化一个转换器类
    # n_components: ·小数:表示保留百分之多少的信息 ·整数:减少到多少特征
#3.#调用fit_transform()
xi = transfer.fit_transform(data) #调用fit_transform()
print(xi.shape,transfer.explained_variance_ratio_)  #查看构成新的几个变量,查看单个变量的方差贡献率
#4.输出新构造出来的主成分变量
Fi=[ ]
for i in range(1,xi.shape[1]+1):
    F="F" + str(i)
    Fi.append(F)
data02 = pd.DataFrame(xi,columns=Fi)
display(data02.head(3))
x1 x2 x3 x4 x5 x6
210 5.0 -0.542916 1.016115 0.165684 6.656838 3.714578
332 5.0 -1.302843 1.063437 0.424865 9.248654 7.514214
326 5.0 -0.511865 1.483560 0.395558 8.955583 3.559323
485 5.0 -0.110560 0.827054 0.168215 6.682154 1.552801
324 5.0 0.356415 0.959323 0.698024 11.980240 -0.782075
(500, 2) [0.76618774 0.22716614]
F1 F2
0 6.144052 -4.055635
1 -4.243350 4.787573
2 1.427541 -1.995314

3、K-means(k均值聚类)

·1、K值的选择【1.可根据业务需求,看需要分多少(n)个组就取n;没有明确要求的时候可以进行网格搜索调节超参数,选择最合适的k值】

·2、随机设置K个特征空间内的点作为初始的聚类中心

·3、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别

·4、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)

·5、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

K-means的APl:

·sklearn.cluster.KMeans(n_clusters=3,init=‘k-means++’) # K-means聚类

。n_clusters:开始的聚类中心数量k值

。init:初始化方法,默认为'k-means++'

.labels_:用来查看默认标记的类型,可以和真实值比较(不是值比较)

K-means性能评估指标

1、轮廓系数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXcJDQkm-1582713296549)(attachment:image.png)]

2、轮廓系数API

·sklearn.metrics.silhouette_score(X,labels)

。计算所有样本的平均轮廓系数
。X:特征值变量
。labels:被聚类标记的目标值

K-means特点总结

·特点分析:采用迭代式算法,直观易懂并且非常实用

·缺点:容易收敛到局部最优解(多次聚类)

·注意:聚类一般做在分类之前,当做出符合业务场景的聚类后,以后的新的数据,就是做分类处理

# 1 数据,我们使用上一段代码x1-x6降维处理后的数据
# display(data02.shape,data02.head(3))

# 2 预估器流程
from sklearn.cluster import KMeans
# estimator = KMeans(n_clusters=3,init='k-means++') #实例化预估器

#引入超参数搜索-网格搜索(Grid Search),模型调优
from sklearn.model_selection import GridSearchCV    #网格搜索和交叉验证
estimator = KMeans(init='k-means++')
#准备参数
param_dict = {"n_clusters":[2,3,4,5,6]} #k值设定的可能取值
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=10) #cv=10是10折交叉验证

estimator.fit(data02) #训练模型


# 3、查看网格搜索和交叉验证返回结果
# 最佳参数:best_params_
print("最佳参数k:",estimator.best_params_)
# 最佳估计器:best_estimator_
print("最佳估计器",estimator.best_estimator_)
#注意best_estimator_的输出解释:metric='minkowski'是名可夫斯基距离,当p=1时是使用曼哈顿距离,当p=2时是使用欧式距离
# 交叉验证结果:cv_results_
#print(estimator.cv_results_)  #比较长这里就不输出了

#estimator.best_estimator_ 表示模型调优后的最佳预估器,如果没有模型调优,后边的预估器直接用estimator

# 4  K-means性能评估
from sklearn.metrics import silhouette_score #轮廓系数
labels = estimator.best_estimator_.labels_
Sc = silhouette_score(data02,labels)
print("轮廓系数Sc(取值为-1到1,越接近1性能越好):",Sc)

#输出分组
y_predict = estimator.best_estimator_.labels_ #输出训练集的分组
# y_predict = estimator.best_estimator_.predict(data02) #输出训练集的分组 和.labels_一样
#构建成二维表查看
import pandas as pd
data02['y'] = y_predict
display(data02.head())

最佳参数k: {‘n_clusters’: 6}
最佳估计器 KMeans(algorithm=‘auto’, copy_x=True, init=‘k-means++’, max_iter=300,
n_clusters=6, n_init=10, n_jobs=1, precompute_distances=‘auto’,
random_state=None, tol=0.0001, verbose=0)
轮廓系数Sc(取值为-1到1,越接近1性能越好): 0.36306500401647485

F1 F2 y
0 6.144052 -4.055635 3
1 -4.243350 4.787573 2
2 1.427541 -1.995314 3
3 7.118382 0.289722 0
4 -3.988264 -3.068422 5
发布了131 篇原创文章 · 获赞 145 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/104522288
今日推荐