如何用无监督机器学习算法基于现有特征生成评分/排名新列
适用的无监督算法及实现方案
以下所有方案均不需要使用z-score、归一化、标准化类传统统计预处理,可直接输入原始10维特征计算评分:
1. 孤立森林(Isolation Forest)
适用场景:需要评分衡量样本的异常/罕见程度时首选。该算法基于特征空间分割逻辑计算得分,对特征尺度不敏感,输出结果可直接作为评分使用,得分越高代表样本越符合多数样本的分布。
实现步骤:
- 直接输入原始特征矩阵训练模型,核心参数
n_estimators(树的数量)、max_samples(每棵树采样的样本数)用默认值即可拿到可用结果 - 调用
score_samples()方法直接得到每个样本的评分
from sklearn.ensemble import IsolationForest import pandas as pd # df为你的原始10特征数据集 clf = IsolationForest(n_estimators=100, random_state=42) clf.fit(df) # 输出评分:值越大样本越正常,越小越异常 df['score'] = clf.score_samples(df) # 生成排名:得分越高排名越靠前 df['rank'] = df['score'].rank(ascending=False)
2. PCA重构误差评分
适用场景:需要评分衡量样本对整体特征分布的代表性时使用。该算法基于协方差矩阵分解计算,不需要提前做特征缩放,重构误差越大说明样本越偏离主成分表征的主流分布。
实现步骤:
- 输入原始特征矩阵训练PCA模型,保留的主成分数量建议设为8-9(覆盖大部分特征方差)
- 对原始特征做降维后再重构,计算原始特征和重构特征的均方误差作为评分
from sklearn.decomposition import PCA import numpy as np pca = PCA(n_components=8, random_state=42) pca.fit(df) # 降维后重构特征 X_reconstructed = pca.inverse_transform(pca.transform(df)) # 计算重构误差作为评分 df['score'] = np.mean((df - X_reconstructed)**2, axis=1) # 生成排名:误差越小(代表性越强)排名越靠前 df['rank'] = df['score'].rank(ascending=True)
3. K近邻平均距离评分
适用场景:需要评分衡量样本周围的局部密度时使用。如果需要平衡各特征贡献又不想用归一化,可以先对每个特征单独做秩转换(不属于你提到的三类标准化方法),消除尺度差异后再计算距离。
实现步骤:
- 可选预处理:对每个特征单独做秩转换,得到每个特征下样本的排名
- 对每个样本计算它到最近K个邻居的平均距离作为评分,距离越大说明样本越孤立
from sklearn.neighbors import NearestNeighbors # 可选:做秩转换平衡各特征权重,不需要可直接用原始df df_ranked = df.rank() # K值建议设为总样本数的1%-5% knn = NearestNeighbors(n_neighbors=5) knn.fit(df_ranked) distances, _ = knn.kneighbors(df_ranked) # 取平均距离作为评分 df['score'] = np.mean(distances, axis=1) # 生成排名:距离越小(密度越高)排名越靠前 df['rank'] = df['score'].rank(ascending=True)
以上方案输出的评分可以直接使用,也可以根据业务需求调整评分的升降序逻辑适配排名规则。
内容的提问来源于stack exchange,提问作者Yereke
相关产品推荐
相关产品推荐

