PCA降维处理和K-means聚类

1、无监督学习

没有目标值(变量)的算法。常见的无监督学习算法:

  • 降维:主成分分析PCA降维处理
  • 聚类:K-means(k均值聚类)

2、主成分分析

应用PCA实现特征的降维

  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
  • 作用:使数据维度压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 应用:回归分析或者聚类分析当中

PCA的APA:

from sklearn.decomposition import PCA

PCA(n_components=None) #主成分分析

  • n_components:
  • 小数:表示保留百分之多少的信息
  • 整数:减少到多少个特征变量 PCA.fit_transform(X)
  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后指定维度的array
# 0 导入常用的数据分析库
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings("ignore") #用于排除警告
from sklearn.decomposition import PCA #主成分降维
from sklearn.preprocessing import StandardScaler #数据标准化

# 1获取数据
df = pd.read_excel(r"D:\Case_data\PCA.xlsx",sheet=0,encoding="utf-8")
display(df.tail(3))
# 获取特征变量
data = df.drop("房价",axis=1,inplace=False)
#display(data.sample(3))

# 2 数据预处理--标准化
#2.实例化一个转换器类
transfer0 = StandardScaler() #实例化一个转换器类
#调用fit_transform()
xi = transfer0.fit_transform(data) #调用fit_transform()
#print(xi)
#转化为二维表
data = pd.DataFrame(xi,columns=data.columns)
display(data.tail(3))

# 3 主成分分析
#.实例化一个转换器类
transfer = PCA(n_components=0.9) #实例化一个转换器类
    # n_components: ·小数:表示保留百分之多少的信息 ·整数:减少到多少特征
#.#调用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))

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

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 ++','random',ndarray,callable},默认='k-means ++'
  • 更多:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

K-means性能评估指标

1.轮廓系数[-1,1]

轮廓系数越接近1,聚类效果越好。

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

2.轮廓系数API

sklearn.metrics.silhouette_score(X,labels)

  • 计算所有样本的平均轮廓系数
  • X:特征值变量
  • labels:被聚类标记的目标,值通常labels = estimator.best_estimator_.labels_

K-means特点总结

  • 特点分析:采用迭代式算法,直观易懂并且非常实用。
  • 缺点:容易收敛到局部最优解(多次聚类)。
  • 注意:聚类一般做在分类之前,当做出符合业务场景的聚类后,以后的新的数据,就是做分类处理。
# 1 数据,我们使用上一段代码-降维处理后的数据
# 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())

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

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



无监督学习PCA降维处理和K-means聚类_实例化_05