机器学习 无监督学习
建模过程:一个模型参数的调整过程。即:给模型输入x后,输出尽可能逼近已知目标y。
在回归模型、贝叶斯模型、决策树模型中,建模阶段都是调用fit
函数,传递两个参数x:用来做预测的特征;y:已知的目标。
回归模型:RMSE、对数类似函数
决策树:基尼系数
贝叶斯模型:用已知目标的数据来提供似然性
这些方法都必须给出已知的Y,否则模型就无法建立。对于这一类方法有一个专门的名称叫有监督学习。
有监督学习
x:变量或独立变量、特征、输入等等;
Y:响应、目标、标签、依赖变量、输出等等;
真正工作时:调用predict
函数。
对未知响应的新数据来进行回归或分类。
实质:通过对训练数据的分析,建立一种从输人特征到输出响应的联系。
【例】客户是否有支票账户、目前欠款金额,性别和婚姻状况,可以知道他是否是高风险客户。
有监督模型
☆模型本身
☆准确的标签
劣势:标签数据的缺乏,成为该类模型的瓶颈。
无监督模型
无监督学习模型的建模过程中,并不需要给出目标或响应,而是完全根据输入特征,来找出相似的数据。
如:聚类 数据被分为几簇
评价标准:依靠数据科学家结合专业领域知识后的理解与解释。
应用场合
没有明显响应变量(不明确要预测什么)
从无明显模式的数据中寻找模式(特征提取)
无监督模型——K-means模型
聚类任务的无监督学习模型。
簇( cluster ):一组相似的数据。
若有n个特征,可构造出n维特征空间。每个样本数据都是空间中以其具体特征为坐标的点。
相似性衡量——点与点在特征空间中的距离
import numpy as np
import pandas as pd
import random
from scipy import stats
from matplotlib import pyplot as plt
x1=[]
x2=[]
y1=[]
y2=[]
for n in range(40):
x1.append(random.gauss(-1,0.25))
x2.append(random.gauss(-1,0.25))
y1.append(random.gauss(1,0.25))
y2.append(random.gauss(1,0.25))
plt.figure(figsize=(8,6))
plt.plot(x1,y1,'og')
plt.plot(x1,x2,'og')
plt.plot(y1,x1,'og')
plt.plot(y1,y2,'og')
plt.xlim([-2.5,2.5])
plt.ylim([-2.5,2.5])
plt.savefig('cluster')
图中的数据,也就是点形成了四个不同的簇,每个簇中的点虽相同却又不靠近。那么每个簇由谁来代表呢,由此引出簇中心的概念:簇中所有点的平均。
plt.figure(figsize=(8,6))
plt.plot(x1,y1,'og')
plt.plot(x1,x2,'og')
plt.plot(y1,x1,'og')
plt.plot(y1,y2,'og')
plt.xlim([-2.5,2.5])
plt.ylim([-2.5,2.5])
plt.plot(np.mean(x1),np.mean(y1),'*r',markersize=15)
plt.plot(np.mean(x1),np.mean(x2),'*r',markersize=15)
plt.plot(np.mean(y1),np.mean(x1),'*r',markersize=15)
plt.plot(np.mean(y1),np.mean(y2),'*r',markersize=15)
plt.savefig('cluster2')
K-means模型的迭代算法
第1步:选择k个初始的簇中心点;
第2步:遍历所有的点,把每个点分配到离它最近的那个簇;
第3步:重新计算簇中心;
第4步:重复前面的第2和第3步,直到达到停止准则。
Scikit-learn库中有现成的K-means对象可以实现K-means聚类
以一个电影数据为示例
my_data=pd.read_csv('C:\Python\Scripts\my_data\\tmdb_5000_movies.csv')
my_data.describe()
from sklearn.cluster import KMeans
# 以'budget','popularity','revenue'三个特征来作为聚类分析的特征
X=my_data[['budget','popularity','revenue']]
km=KMeans(n_clusters=3,random_state=1)
# 这次的fit函数只传了一个参数
km.fit(X)
my_cl=pd.DataFrame(data=km.labels_,columns=['cluster'])
X=pd.concat([X,my_cl],axis=1)
X.head(5)
# 对聚类得到的结果进行分组统计
X.groupby('cluster').mean()
图形化展示聚类的结果
x=X['budget']
y=X['popularity']
z=X['revenue']
colors=list()
palette={0:"red",1:"green",2:"blue"}
# 字典,给三种类别对应散点图中的三种 marker_color
for n,row in enumerate(X['cluster']): # 根据类别为每个样本设置绘图颜色
colors.append(palette[X['cluster'][n]])#
fig = plt.figure(figsize=(12,10))
ax = fig.gca(projection='3d')
ax.scatter(x,y,z,color=colors)
ax.set_xlim(0,2e8)
ax.set_zlim(0,1e9)
ax.set_xlabel('budget',size=15)
ax.set_ylabel('popularity',size=15)
ax.set_zlabel('revenue',size=15)
fig.savefig('cluster3')
可以看到不同类别占据特征空间中的不同位置。