第6章 无监督学习没有标准答案怎么办一句话点题监督学习是做题对答案无监督学习是发一堆混在一起的扑克牌没人告诉你怎么分你自己整理。没有标准答案但机器照样能找出规律来。写在前面上一章我们学的监督学习有个前提数据得有标签标准答案。但现实中大量数据是没有标签的。你有一堆用户行为日志没人给每条记录标上这是高价值用户或这是流失用户你有几万条商品评论没人标过正面或负面你有一堆传感器数据没人告诉你哪条是正常哪条是异常。标注数据费时费力——请人标1万条数据可能要花几万块、花几周时间。没有标签机器还能学吗能。这就是无监督学习干的事。一、无监督学习到底在干什么1. 跟监督学习的区别监督学习无监督学习有没有标签有没有目标学会预测给新数据一个答案发现结构在数据里找规律比方做题对答案自己找规律分类例子判断邮件是不是垃圾邮件把用户自动分成几群能验证对错吗能有标准答案不能没有标准答案只能看分得合不合理2. 三大任务无监督学习主要干三件事任务干什么大白话典型应用聚类把相似的数据分到一组自动分组用户分群、文档归类降维把高维数据压缩到低维浓缩信息数据可视化、特征压缩异常检测找出跟大多数不一样的数据找异类欺诈检测、故障预警下面逐个讲。二、聚类让机器自动分组1. 什么是聚类聚类的目标很简单把相似的东西放一起不相似的分开。你不需要告诉机器分几类或怎么分机器自己根据数据的特征来找天然的分群。生活类比你去一个陌生超市买水果没人告诉你哪个是苹果哪个是梨。但你看一眼就能分出来——红的一堆、黄的一堆、长得不一样嘛。聚类就是让机器干这个事。2. K-Means——最经典的聚类算法K-MeansK均值是最常用的聚类算法原理非常直白你告诉机器分K组K是你定的数字机器随机放K个中心点每条数据找离自己最近的中心点归到那一组每组重新算中心点组内所有点的平均位置重复步骤3和4直到分组不再变化用图来理解第1轮随机放中心点 第2轮重新分组 第3轮稳定了 · · ☆① · · | ① · · | ① · ·· ··· · ··|·· · ·· | ·· ··· ···· → ···|···· → ··· | ···· ····· ☆② ·····|② ····· | ② · ·· · ··| · ·· | ☆③ ①②③ 三个中心点 竖线 分界线 分组完成大白话你说分3组机器就把数据分成3堆让每堆里的数据尽量相似堆跟堆之间尽量不同。3. K-Means的优缺点优点缺点简单、速度快你得自己定K分几组大数据量也能扛只能找圆形的簇形状怪的搞不定解释性好中心点就是每组的代表对异常值敏感一个离群点能把中心点拉偏使用广泛、工具成熟初始中心点随机放每次结果可能不同4. DBSCAN——不需要你定分几组的聚类K-Means的痛点是你得提前告诉它分几组但你往往不知道该分几组。DBSCAN解决了这个问题。DBSCAN的原理密度大的地方就是一群密度小的地方就是边界。它自动根据数据的密集程度来分群不需要你指定组数。生活类比K-Means是你跟机器说把这100个人分3组DBSCAN是机器自己看这30个人挤在一起算一组那边50个人挤一起算一组剩下20个散在各地的算异常。K-MeansDBSCAN需要指定分几组吗需要不需要能处理不规则形状吗不能能能识别异常点吗不能能速度快中等适合场景数据大致成圆形分布数据形状不规则、需要识别异常5. 聚类实战用户分群一个常见的业务场景你有1万个用户的消费数据想把用户自动分群做精细化运营。importpandasaspdimportnumpyasnpfromsklearn.clusterimportKMeansfromsklearn.preprocessingimportStandardScalerimportmatplotlib.pyplotasplt# 第1步准备数据 # 模拟用户消费数据np.random.seed(42)data{月消费金额:np.concatenate([np.random.normal(500,100,300),# 低消费群体np.random.normal(3000,500,500),# 中等消费群体np.random.normal(8000,1000,200),# 高消费群体]),月访问次数:np.concatenate([np.random.normal(5,2,300),# 低频用户np.random.normal(20,5,500),# 中频用户np.random.normal(40,8,200),# 高频用户])}dfpd.DataFrame(data)# 第2步数据标准化 # 不同特征的量纲不同消费金额几千、访问次数几十必须标准化scalerStandardScaler()X_scaledscaler.fit_transform(df)# 第3步选K用手肘法 inertias[]K_rangerange(1,10)forkinK_range:kmeansKMeans(n_clustersk,random_state42,n_init10)kmeans.fit(X_scaled)inertias.append(kmeans.inertia_)# 手肘法画图找拐点拐点对应的K就是最佳分组数plt.figure(figsize(8,4))plt.plot(K_range,inertias,bo-)plt.xlabel(K (分组数))plt.ylabel(Inertia (组内方差))plt.title(手肘法选K)plt.axvline(x3,colorr,linestyle--,label最佳K3)plt.legend()plt.tight_layout()plt.savefig(elbow.png,dpi100)# 第4步训练模型 kmeansKMeans(n_clusters3,random_state42,n_init10)df[群体]kmeans.fit_predict(X_scaled)# 第5步分析结果 print(各群体特征)print(df.groupby(群体).agg({月消费金额:[mean,count],月访问次数:mean}).round(0))# 输出结果示例# 群体 月消费金额(mean) 月访问次数(mean) 人数# 0 502 5 300 ← 低频低消费# 1 3001 20 500 ← 中频中消费# 2 7998 40 200 ← 高频高消费6. 手肘法——怎么确定分几组K-Means最头疼的问题是K设多少合适。手肘法是最常用的解决方案原理试不同的K值1到10算每个K对应的组内方差每个点到自己中心点的距离之和。K越大方差越小分组越细当然越紧凑。但方差下降到某个点会突然变缓——这个拐点就像胳膊的手肘就是最佳K值。Inertia | | · | · | · | · ← 拐点手肘K3最佳 | · · · · · | └────────────────── K 1 2 3 4 5 6 7大白话分1组太粗、分10组太细找个刚好的拐点。三、降维把高维数据压缩1. 为什么需要降维假设你有一个用户画像有200个特征年龄、性别、收入、消费频次、浏览时长、地域……。这200个特征里有些是冗余的月收入和年收入其实是一回事有些是噪声用户ID对分析没有意义有些维度太高没法可视化你能画2维3维的图但画不了200维的降维就是把200个特征压缩成10个或2个同时尽量不丢失关键信息。降维的好处大白话减少计算量数据瘦身后跑得更快去掉冗余把重复的信息合并可视化降到2维3维就能画图看了降噪去掉没用的特征留下核心信息2. PCA——最常用的降维方法PCA主成分分析的原理用大白话说找出数据中信息量最大的几个方向把数据投影到这些方向上用更少的维度表示原始数据。生活类比你拍一个3D的物体照片从不同角度拍信息量不同——正面拍能看出形状俯拍可能只能看到一个圆。PCA就是帮你找到最能体现这个物体特征的拍摄角度。原始数据PCA降维后维度200维2维信息量100%~85%损失15%可视化不行可以画散点图计算速度慢快关键取舍降维必然丢信息问题是你愿意丢多少。通常降到能保留85%-95%信息量的维度就够了。3. 降维的典型应用应用场景怎么用价值数据可视化200维降到2维画散点图直观看到数据分布和聚类模型加速降维后再训练模型减少计算量训练更快特征压缩把相关特征合并减少冗余降低过拟合风险大模型中的Embedding768维向量降到更低维减少存储和检索压力RAG中常用4. 降维实战可视化高维数据fromsklearn.decompositionimportPCAfromsklearn.datasetsimportload_irisimportmatplotlib.pyplotasplt# 加载鸢尾花数据集4个特征花萼长宽、花瓣长宽irisload_iris()Xiris.data# 4维yiris.target# 3种花# PCA降到2维pcaPCA(n_components2)X_2dpca.fit_transform(X)print(f原始维度:{X.shape[1]}维)print(f降维后:{X_2d.shape[1]}维)print(f保留信息量:{pca.explained_variance_ratio_.sum():.1%})# 画图plt.figure(figsize(8,5))colors[red,green,blue]fori,colorinenumerate(colors):plt.scatter(X_2d[yi,0],X_2d[yi,1],ccolor,labeliris.target_names[i])plt.xlabel(主成分1)plt.ylabel(主成分2)plt.title(PCA降维可视化)plt.legend()plt.tight_layout()plt.savefig(pca.png,dpi100)4维数据降到2维保留了97.8%的信息量还能画图看到三种花明显分成三堆——这就是降维的价值。四、异常检测找出不对劲的数据1. 什么是异常检测异常检测的目标从大量数据中找出跟大多数不一样的少数数据。这些不一样的数据往往是重要的信用卡交易里的欺诈交易服务器日志里的异常请求工厂传感器数据里的设备故障前兆网络流量里的攻击行为2. 为什么不用监督学习你可能会想用监督学习训练一个正常vs异常的分类器不就行了问题在于困难说明异常样本太少欺诈交易可能只占0.01%类别极不平衡异常种类未知今天的欺诈手段和明天的不一样你没法穷举标注困难哪些是异常很多时候事后才知道所以异常检测通常用无监督方法只学正常长什么样跟正常不一样的就是异常。3. 常用方法方法原理大白话适合场景Isolation Forest随机切分数据异常点容易被孤立异常点人缘差几下就单独切出来了通用异常检测One-Class SVM学一个边界把正常数据包住画个圈圈外的是异常边界清晰的场景DBSCAN密度低的地方的点算异常不属于任何一群的就是异类兼顾聚类和异常检测自编码器用神经网络学重建正常数据重建误差大的就是异常只见过正常的遇到异常就不认识了复杂高维数据4. 异常检测实战fromsklearn.ensembleimportIsolationForestimportnumpyasnp# 模拟正常交易数据金额0-1000频率1-10次/天np.random.seed(42)normal_datanp.column_stack([np.random.normal(200,100,1000),# 交易金额np.random.normal(5,2,1000),# 日交易次数])# 模拟异常交易anomaliesnp.array([[5000,50],# 大额高频[8000,1],# 超大额[50,30],# 小额超高频[3000,25],# 大额高频])# 训练Isolation ForestmodelIsolationForest(contamination0.05,random_state42)model.fit(normal_data)# 预测异常predictionsmodel.predict(anomalies)fori,predinenumerate(predictions):status异常 ⚠️ifpred-1else正常 ✅print(f交易(金额{anomalies[i][0]:.0f}, 次数{anomalies[i][1]:.0f}) →{status})# 预测正常数据应该都判为正常normal_predmodel.predict(normal_data[:10])print(f\n正常数据检测:{sum(normal_pred1)}/10 判为正常)5. 异常检测的实践要点要点说明contamination参数预估异常比例设高了误报多设低了漏报多特征选择选跟异常相关的特征无关特征会干扰检测阈值调优异常检测输出的是异常分数阈值设多少需要根据业务调人工反馈检测出的异常需要人工确认反馈结果用来持续优化五、监督学习 vs 无监督学习什么时候用哪个判断维度用监督学习用无监督学习有标签吗有没有目标明确吗明确要预测什么不明确想探索数据能验证对错吗能不能效果评估有明确指标准确率等靠业务判断分得合不合理典型场景垃圾邮件检测、房价预测用户分群、异常检测、数据探索实践中的组合使用很多时候不是二选一而是先无监督、后监督第一步无监督聚类把用户分成5群 ↓ 第二步人工看看每群的特征给每群起名字高价值/低价值/潜力/流失风险/新用户 ↓ 第三步用这些带标签的数据训练监督学习模型 ↓ 第四步新用户来了模型自动判断属于哪一群这就是半监督学习的思路——用无监督方法生成标签再用监督方法做预测。两全其美。六、一个常见的认知误区误区“无监督学习不需要标签所以更简单”事实恰恰相反。无监督学习往往比监督学习更难用好原因没有标准答案效果难评估。你把用户分成了5群但分得对不对没有客观标准只能靠业务人员判断这个分群有没有用参数更难调。K-Means的K设多少、DBSCAN的密度阈值设多少都需要反复试结果不稳定。同样的数据不同参数可能得到完全不同的结果需要更多业务理解。机器分完群后你得解释这群人有什么特征这需要对业务的理解所以无监督学习不是偷懒的方案而是探索的方案。它适合用来发现你不知道的规律而不是替代监督学习做预测。七、本章涉及算法速查表算法类型原理一句话适合场景K-Means聚类找K个中心点按距离分组用户分群、文档归类DBSCAN聚类密度大的地方就是一群不规则形状、识别异常层次聚类聚类自底向上或自顶向下逐步合并/拆分需要看分群层次关系的场景PCA降维找信息量最大的方向投影数据可视化、特征压缩t-SNE降维保持局部结构的非线性降维高维数据可视化比PCA更精细Isolation Forest异常检测异常点容易被随机切分孤立通用异常检测One-Class SVM异常检测学一个边界包住正常数据边界清晰的异常检测本章小结要点内容无监督学习没有标签让机器自己发现数据中的结构和规律三大任务聚类自动分组、降维压缩信息、异常检测找异类K-Means最经典聚类算法需要指定K手肘法选KDBSCAN不需要指定分组数能识别异常点适合不规则形状PCA最常用降维方法用更少维度保留更多信息异常检测只学正常长什么样跟正常不一样的就是异常实践建议先无监督探索→人工标注→后监督预测无监督不是偷懒而是探索核心认知没有标准答案不代表没有规律机器照样能找出隐藏的结构下一章预告第7章「特征工程数据质量决定AI上限」—— 垃圾进垃圾出是机器学习的铁律。同样的算法好的特征工程能让效果提升30%以上。这章教你怎么从原始数据中榨出最有价值的特征。