没有目标值(变量)的算法
常见的无监督学习算法:
降维:
– 主成分分析PCA降维处理
聚类:
– K-means(k均值聚类)
2、主成分分析应用PCA实现特征的降维
·定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
·作用:是数据维散压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
·应用:回归分析或者聚类分析当中
PCA的APA:·sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间
'''#构造一组特征值数据'''
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 |
·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、轮廓系数
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 |