5.1 分类与预测
预测问题的两种主要类型:分类&预测
(1)实现过程
分类:是构造一个分类模型,输入样本的属性值,输出对应的类别,将每个样本映射到预先定义好的类别。
--分类属于有监督的模型(聚类是无监督的)
预测:是建立>=2种变量间相互依赖的函数模型,然后进行预测或控制。
分类算法的过程有2步:step1:学习步,通过归纳分析训练样本集来建立分类模型,得到分类规则;step2:分类步:先用已知的测试样本集评估分类规则的准确率,如果准确率是可以接受的,则使用该模型对未知类标号的待测样本集进行预测。
注意:规则本身就是一种算法。
P.S. 以前的AI模型是“垂直的”,现在的AI倾向于“大模型”。
(2)常用的分类与预测算法
近几年进步最大的是人工神经网络(工程实践效果很好)。
(3)回归分析
从19世纪高斯提出的最小二乘估计算起,有近200年历史。
在数据挖掘中,记住线性回归、Logistic回归(二分类or多分类问题)
5.2 聚类分析
- 与分类不同,聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。
- 与分类模型需要使用有类标记样本构成的训练数据不同,聚类模型可以建立在无类标记的数据上,是一种非监督的学习算法。
- 聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度将他们划分为若干组,划分的原则是组内样本最小化而组间(外部)距离最大化
聚类分析——常用聚类分析算法
常用聚类方法如下表:
常用聚类算法如下表:
聚类分析——K-Means聚类算法
1、概述
K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。
K-Means聚类算法中,一般需要度量样本之间的距离、样本与簇之间的距离以及簇与簇之间的距离。
2、算法过程
1)从N个样本数据中随机选取K个对象作为初始的聚类中心;
2)分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中;
3)所有对象分配完成后,重新计算K个聚类的中心;
4)与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转2),否则转5);
5)当质心不发生变化时停止并输出聚类结果。
3、K-Means上机实验
from sklearn.cluster import KMeans
import pandas as pd
import matplotlib.pyplot as plt
# Constants initialization
K = 3
MAX_ITER = 500
N_JOBS = 4
RANDOM_STATE = 1234
INPUTFILE = '../chap5/consumption_data.xls'
OUTPUTFILE = '../chap5/data_type.xls'
PIC_OUTPUT = '../chap5/pd_chatgpd'
# Read input data
input_data = pd.read_excel(INPUTFILE, index_col='Id')
# Data Pre-processing - Z-score normalisation
normalized_data = (input_data - input_data.mean()) / input_data.std()
# Clustering model setup
clustering_model = KMeans(n_clusters=K, max_iter=MAX_ITER, random_state=RANDOM_STATE)
# Train the model with normalized data
clustering_model.fit(normalized_data)
# Print Results
cluster_labels = clustering_model.labels_
cluster_counts = pd.Series(cluster_labels).value_counts()
cluster_centers = pd.DataFrame(clustering_model.cluster_centers_)
results_df = pd.concat([cluster_centers, cluster_counts], axis=1)
results_df.columns = list(input_data.columns) + ['Cluster Count']
print(results_df)
# Save labeled data to output file
labeled_data = pd.concat([input_data, pd.Series(cluster_labels, index=input_data.index)], axis=1)
labeled_data.columns = list(input_data.columns) + ['Cluster']
labeled_data.to_excel(OUTPUTFILE)
def density_plot(data):
# plotting function
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# p = data.plot(kind='kde', linewidth=2, subplots=True, sharex=False)
p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False,title='by number_035')
[p[i].set_ylabel('Density') for i in range(K)]
plt.legend()
return plt
for i in range(K):
density_plot(input_data[labeled_data['Cluster'] == i]).savefig('%s%s.png' % (PIC_OUTPUT, i))
并且生成以下3张聚类密度函数图:
输出的 data_type.xls 文件: