算法思想
- 对原始数据标准化(均值0方差1)
- PCA有两种计算方法:最大投影方差与最小重构代价(可以查看下面的PCA推导)
在异常检测中,使用的逻辑是:
- 对训练集做特征值分解:特征向量代表方向,对应的特征值是空间中这个方向的方差,特征值越大,方差越大
- 我们可以把特征向量所指的方向,看做正常样本点的方向(因为训练集中绝大多数是正常样本点),而计算出的特征值越大,意味着异常点在这个方向上与正常样本的差异越大
- 所以接下来,我们只要把跟正常样本不是一路人的点找到就行,它们是异常点,
- 以
特征值 作为权重,计算样本点 与特征值对应的特征向量 的距离差(点乘后平方)就计算出X与这个方向的偏差程度 - 累加X与每个方向的偏差程度就是X与所有方向的偏差程度
- 有特征值加权的偏差程度累加到一定程度就是异常点了,这个阈值有PCA训练得出
PCA推导
示例代码
from pyod.utils.data import generate_data
from pyod.models.pca import PCA
def get_data():
"""生成数据"""
X_train, X_test, y_train, y_test = generate_data(n_features=6, contamination=0.2, behaviour='new')
return X_train, X_test, y_train, y_test
def get_score(true_data, result_prediction):
"""
分类问题的得分辅助函数
:param true_data: 真实值,是要预测的目标
:param result_prediction: 预测值,用模型预测出来的值
:return:准确率,精确率,召回率,F1
:rtype:list
"""
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
acc = accuracy_score(true_data, result_prediction)
prec = precision_score(true_data, result_prediction)
recall = recall_score(true_data, result_prediction)
f1 = f1_score(true_data, result_prediction)
score_list = [acc, prec, recall, f1]
return score_list
def main():
x_train, x_test, y_train, y_test = get_data()
pca_model = PCA(contamination=0.2)
pca_model.fit(x_train)
score_list = get_score(y_test, pca_model.predict(x_test))
print("准确率:{},精确率:{},召回率:{},F1:{}".format(score_list[0], score_list[1], score_list[2], score_list[3]))
if __name__ == '__main__':
main()
|