目录

一、 定义和公式

1. 决策树 Desicion Tree

2. 异常检测 Anomaly Detection

3. 主成分分析 PCA

二、 代码实战

1. 决策树:Iris鸢尾花数据分类

2. 异常检测

2.1 可视化高斯分布的概率密度函数

2.2 建立模型,实现异常数据点预测,可视化异常检测处理结果,修改概率分布阈值EllipticEnvelope(contamination=0.1)中的contamination,查看阈值改变对结果的影响

3. 主成分分析PCA:Iris数据集降维后分类 4D->2D

3.1 基于iris_data.csv数据,建立KNN模型实现数据分类(n_neighbors=3)

3.2 对数据进行标准化处理,选取一个维度可视化处理后的效果

3.3 进行与原数据等维度PCA,查看各主成分的方差比例

​3.4 保留合适的主成分,可视化降维后的数据

3.5 基于降维后数据建立KNN模型,与原数据表现进行对比


一、 定义和公式

1. 决策树 Desicion Tree

决策树:对实例进行分类的树形结构,通过多层判断区分目标所属类别

缺点:忽略属性间的相关性,样本分布不均匀时影响表现

给定训练数据集:

核心:特征选择(每个叶子)应该用哪个特征

三种方法:ID3,C4.5,CART

ID3:用信息熵原理选择信息增益最大的属性作为分类属性,递归的拓展决策树的分支,完成决策树的构造

  • 信息熵 Entropy:是度量随机变量不确定性的指标,熵越大,变量不确定性越大

   D:当前样本集合,Pk:第k类样本所占比例,如10个样本,第2类样本为5个,其比例为1/2

当Pk=1时,即100%比例,无不确定性,Ent(D)=0

当Pk=0时,即另一个类别的Pk=1,Ent(D)=0

  • 信息增益:根据信息熵,计算出以属性a(叶子)进行样本划分带来的信息增益,越大越好

    原信息熵 - 属性a新分类后的信息熵,V:根据属性a划分出的类别数,D:当前样本总数,Dv:类别v的样本数

  • 算法流程:

1. 先计算总信息熵Ent(D),即分类后的比例

2. 依次计算出每个属性对应的信息增益Gain(D,a),每个属性有两个划分(1/0)

3. 信息增益最大的属性作为第一个节点,第二大的作为第二个节点

  • 优点:有可能10个样本只用2个属性就分类好了,这就是信息增益最大化的优势

2. 异常检测 Anomaly Detection

异常检测:根据输入数据,对不符合预期磨损的数据进行识别

概率密度函数:描述随机变量在某个确定的取值点附近的可能性,概率密度小的点,是异常点

区间(x1,x2)的概率为:

    即区域内面积

高斯分布概率密度函数:服从正态分布,钟形曲线

    mean:均值,sigma:标准差

    mean:所有样本之和除以样本数量,sigma:样本分布密度(分散/集中)

算法流程:

  1. 已知样本数据xi,先求出均值和标准差
  2. 再计算出概率密度p(x)
  3. 如果p(x) < 期望值empra,该点为异常点

高维度高斯分布概率密度函数:

3. 主成分分析 PCA

用主成分分析的方法实现数据降维 Dimensionality Reduction:降低随机变量的个数,得到一组不相关主变量的过程

优点:减少数据量,提高效率,低维度数据可以实现可视化

主成分分析 Principal Component Analysis:寻找k(k<n)维的新数据,使它们反映事物的主要特征,在信息损失少的情况下,降低维度。如2维降为1维是将每个点都投影到中间的直线上,(3维降为2维是将立体点投影到平面),投影代表主成分分析,每个点到投影直线的距离上损失信息,损失信息之和应尽可能小

如何保留主要信息:投影后数据的方差越大,投影后的不同特征数据越分散(即不相关)

算法流程:

  1. 原始数据预处理(标准化:均值mean=0,标准差sigma=1)
  2. 计算协方差矩阵的特征向量,及数据在各个特征向量投影后的方差
  3. 根据需求(任务指定或方差比例)确定降维的维度k(方差大的)
  4. 选取k维特征向量,计算数据在其形成空间的投影

二、 代码实战

1. 决策树:Iris鸢尾花数据分类

Iris数据集介绍:3类,共150条记录,每类50个数据,每条记录有4项特征,即花萼长和宽,花瓣长和宽,标签3个(0/1/2)代表3类

'''
任务:
1. 基于iris_data.csv数据,建立决策树模型,评估模型表现
2. 可视化决策树结构
3. 修改min_samples_leaf参数,对比模型结果
'''# 1. 加载数据
# load the data
import pandas as pd
import numpy as np
data = pd.read_csv('iris_data.csv')
data.head()# 2. 赋值数据
# define the X and y
X = data.drop(['target','label'],axis=1)
y = data.loc[:,'label']
print(X.shape,y.shape)# 3. 建立决策树模型
# establish the decision tree model
from sklearn import tree
dc_tree = tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5)
dc_tree.fit(X,y)# 3. 评估模型表现
# evaluate the model
y_predict = dc_tree.predict(X)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy)# 4. 可视化决策树
# visualize the tree
%matplotlib inline
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,20))
tree.plot_tree(dc_tree,filled='True',feature_names=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'],class_names=['setosa','versicolor','virginica'])# 5. 修改分支深度,即修改min_samples_leaf参数,对比模型结果
dc_tree = tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=1)
dc_tree.fit(X,y)
fig = plt.figure(figsize=(20,20))
tree.plot_tree(dc_tree,filled='True',feature_names=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'],class_names=['setosa','versicolor','virginica'])

2. 异常检测

'''
加载anomaly_data.csv数据,可视化数据分布情况
'''
# 1. 加载数据
#load the data
import pandas as pd
import numpy as np
data = pd.read_csv('anomaly_data.csv')
data.head()# 2. 数据赋值,为了方便调用
#define x1 and x2
x1 = data.loc[:,'x1']
x2 = data.loc[:,'x2']# 3. 可视化原数据:散点图
#visualize the data
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(10,5)) # 图形大小
plt.scatter(x1,x2) # 调用赋值后的数据
plt.title('data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()# 4. 可视化数据:用直方图绘制数据分布情况
# coding:utf-8
import matplotlib as mlp
font2 = {'family' : 'SimHei',
'weight' : 'normal',
'size'   : 20,
}
mlp.rcParams['font.family'] = 'SimHei'
mlp.rcParams['axes.unicode_minus'] = Falsefig2 = plt.figure(figsize=(20,5))plt.subplot(121)
plt.hist(x1,bins=100) # 数据分布情况,分成100个数据分割,直方图可视化
plt.title('$x_1$ Data distribution statistics',font2)
plt.xlabel('$x_1$',font2)
plt.ylabel('occurrences number',font2)plt.subplot(122)
plt.hist(x2,bins=100)
plt.title('x2 distribution')
plt.xlabel('x2')
plt.ylabel('counts')plt.show()

fig1:

fig2:

2.1 可视化高斯分布的概率密度函数

'''
任务1:
可视化高斯分布的概率密度函数
'''
# 5. 计算均值和标准差
#calculate the mean and sigma of x1 and x2
x1_mean = x1.mean() # 均值
x1_sigma = x1.std() # 标准差
x2_mean = x2.mean()
x2_sigma = x2.std()
print(x1_mean,x1_sigma,x2_mean,x2_sigma)# 6. 计算高斯分布的概率密度
#calculate the gaussian distribution p(x)
from scipy.stats import normx1_range = np.linspace(0,20,300) # 产生0到20之间300个均分的数据点
x1_normal = norm.pdf(x1_range,x1_mean,x1_sigma) # 计算出300个数据的所对应的高斯分布概率密度函数x2_range = np.linspace(0,20,300)
x2_normal = norm.pdf(x2_range,x2_mean,x2_sigma)# 7. 可视化高斯分布概率密度曲线,正态分布,对应x1和x2的数据分布
#visualize the p(x)
fig3 = plt.figure(figsize=(20,5)) # 创建新的图形对象plt.subplot(121) #
plt.plot(x1_range,x1_normal)
plt.title('normal p(x1)')plt.subplot(122)
plt.plot(x2_range,x2_normal)
plt.title('normal p(x2)')plt.show()

fig3:

2.2 建立模型,实现异常数据点预测,可视化异常检测处理结果,修改概率分布阈值EllipticEnvelope(contamination=0.1)中的contamination,查看阈值改变对结果的影响

'''
任务2:
建立模型,实现异常数据点预测,可视化异常检测处理结果,修改概率分布阈值EllipticEnvelope(contamination=0.1)中的contamination,查看阈值改变对结果的影响
'''# 1. 对异常数据点进行建模
#establish the model and predict
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope(contamination=0.03) # 各个维度的概率密度相乘得到一个阈值,阈值大时,容易将正常点判断成异常点
ad_model.fit(data)# 2. 预测异常数据模型
#make prediction
y_predict = ad_model.predict(data)
print(y_predict, pd.value_counts(y_predict))# 3. 可视化异常数据
#visualize the result
fig4 = plt.figure(figsize=(10,6))
orginal_data=plt.scatter(data.loc[:,'x1'],data.loc[:,'x2'],marker='x')
anomaly_data=plt.scatter(data.loc[:,'x1'][y_predict==-1],data.loc[:,'x2'][y_predict==-1],marker='o',facecolor='none',edgecolor='red',s=150)plt.title('anomaly detection result',font2) # 自动寻找异常数据
plt.xlabel('$x_1$',font2)
plt.ylabel('$x_2$',font2)
plt.legend((orginal_data,anomaly_data),('original data','anomaly data'))
plt.axis([4.5,15,2.5,15])
plt.show()

fig4:

3. 主成分分析PCA:Iris数据集降维后分类 4D->2D

# 1. load data
import pandas as pd
import numpy as np
data = pd.read_csv('/iris_data.csv')
data.head()# 2. define X and y
X = data.drop(['target','label'],axis=1)
y = data.loc[:,'label']
y.head()

3.1 基于iris_data.csv数据,建立KNN模型实现数据分类(n_neighbors=3)

'''
任务1:
基于iris_data.csv数据,建立KNN模型实现数据分类(n_neighbors=3)
'''
# 3. 建立模型、预测、并计算准确率
#establish knn model and calculate the accuracy
from sklearn.neighbors import KNeighborsClassifier
KNN = KNeighborsClassifier(n_neighbors=3)
KNN.fit(X,y)y_predict = KNN.predict(X)from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy) # 0.96

3.2 对数据进行标准化处理,选取一个维度可视化处理后的效果

'''
任务2:
对数据进行标准化处理,选取一个维度可视化处理后的效果
'''
# 4. 数据标准化预处理,方差mean=0,标准差std=1
from sklearn.preprocessing import StandardScaler
X_norm = StandardScaler().fit_transform(X)
print(X_norm)# 5. 计算方差mean和标准差sigma
#calcualte the mean and sigma
x1_mean = X.loc[:,'sepal length'].mean()
x1_norm_mean = X_norm[:,0].mean()
x1_sigma = X.loc[:,'sepal length'].std()
x1_norm_sigma = X_norm[:,0].std()
print(x1_mean,x1_sigma,x1_norm_mean,x1_norm_sigma)# 6. 可视化:直方图对比原数据和标准化数据
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(20,5))plt.subplot(121)
plt.hist(X.loc[:,'sepal length'],bins=100)plt.subplot(122)
plt.hist(X_norm[:,0],bins=100)plt.show()

fig1:

3.3 进行与原数据等维度PCA,查看各主成分的方差比例

'''
任务3:
进行与原数据等维度PCA,查看各主成分的方差比例
'''
# 7. PCA分析:模型训练获得降维后的数据
#pca analysis
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
X_pca = pca.fit_transform(X_norm)# 8. 计算主成分的方差比例
#calculate the variance ratio of each principle components
var_ratio = pca.explained_variance_ratio_
print(var_ratio)
# 结果:只保留前两个主成分即可,即4维降为2维# 9. 可视化方差比例
fig2 = plt.figure(figsize=(20,5))
plt.bar([1,2,3,4],var_ratio)
plt.xticks([1,2,3,4],['PC1','PC2','PC3','PC4'])
plt.ylabel('variance ratio of each PC')
plt.show()# 10. 只保留前两个主成分即可,即4D -> 2D,后两个方差比例小
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_norm)
X_pca.shape
type(X_pca)

fig2:

3.4 保留合适的主成分,可视化降维后的数据

'''
任务4:
保留合适的主成分,可视化降维后的数据
'''
# 11. 可视化2D数据
#visualize the PCA result
fig3 = plt.figure(figsize=(5,3))
setosa=plt.scatter(X_pca[:,0][y==0],X_pca[:,1][y==0])
versicolor=plt.scatter(X_pca[:,0][y==1],X_pca[:,1][y==1])
virginica=plt.scatter(X_pca[:,0][y==2],X_pca[:,1][y==2])
plt.legend((setosa,versicolor,virginica),('setosa','versicolor','virginica'))
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()# 保存图形
fig3.savefig('1.png')

fig3:

3.5 基于降维后数据建立KNN模型,与原数据表现进行对比

'''
任务5:
基于降维后数据建立KNN模型,与原数据表现进行对比
'''
# 计算PCA后的准确率
KNN = KNeighborsClassifier(n_neighbors=3)
KNN.fit(X_pca,y)
y_predict = KNN.predict(X_pca)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy) # 0.95

机器学习(四)其它技术:决策树,异常检测,PCA相关推荐

  1. 异常检测-PCA方法

    文章目录 异常检测-PCA方法 线性回归-最小二乘拟合 目标函数的数学意义 正规方程解决最小二乘问题 PCA用于异常检测 PyOD实例 异常检测-PCA方法 记录DataWhale的异常检测的学习过程 ...

  2. 机器学习(十五)异常检测

    文章目录 Log 一.问题动机(Problem motivation) 1. 直观理解异常检测 2. 正式定义异常检测 3. 异常检测应用案例 ①欺诈检测 ②工业生产领域 ③数据中心的计算机监控 二. ...

  3. 基于机器学习的UEBA在账号异常检测中的应用

    UEBA UEBA是一种采用高级数据分析方法.面向用户和实体网络行为,进行异常检测和调查的技术,也是安全智能分析切入点. U:表示用户(User),UEBA不是一般的安全分析,而是以分析用户活动为首要 ...

  4. 吴恩达机器学习(二十七)异常检测、高斯分布

    目录 1.异常检测 2.高斯分布 3.异常检测VS监督学习 4.选择要使用的功能 5.多变量高斯分布以及它在异常检测中的应用 1.异常检测   这一章中将介绍异常检测问题,这是机器学习算法的常见应用, ...

  5. 机器学习笔记十二之异常检测

    本节目录 1 问题的动机 2 高斯分布 3 开发和评价一个异常检测系统 4 异常监测与监督学习对比 5 选择特征 6 多元高斯分布 7 多元高斯分布进行异常检测 1 问题的动机 我们先看下什么是异常检 ...

  6. 入门机器学习(二十)--编程作业-异常检测和推荐系统(Python实现)

    编程作业–异常检测和推荐系统 在本练习中,我们将使用高斯模型实现异常检测算法,并将其应用于检测网络上的故障服务器. 我们还将看到如何使用协作过滤构建推荐系统,并将其应用于电影推荐数据集. Anomal ...

  7. 人工智能-机器学习:Anomaly Detection(异常检测)

    一.什么是 Anomaly(异常) Anomaly Detection,也叫做 异常检测,目的在于让机器知道我所不知道的事情. 虽然说是 异常,但其实是以训练集为核心,判断输入数据是否与训练集中的数据 ...

  8. 机器学习如何做好分布外异常检测?谷歌这篇 NeurIPS 2019 论文提出了方法

    2019-12-30 10:16:57 编译 | 翻译官balala 编辑 | 丛末 对于机器学习而言,区分异常数据或有显著差异数据至关重要.谷歌在 NeurIPS 2019 论文中提出并发布了针对基 ...

  9. NeurIPS | 谷歌使用机器学习如何做好分布外异常检测

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :AI科技评论 [人工智能资 ...

  10. 机器学习第六回——降维+异常检测

    降维 目的 数据压缩.从而使用较少的计算机内存或磁盘空间,并且让我们加快我们的学习算法. 例如:从二维降到一维 数据可视化.由于多为(例如50维)的数据是不可以进行可视化的,利用降维的方法把它降到2维 ...

最新文章

  1. 改名之后的Java EE,现在有什么新进展?
  2. CTO丢给我《技术Leader的30条军规》:照着做,做不好滚回去写代码!
  3. 捣鼓 Subversion
  4. 微软一站式示例代码库 2012 年2月示例代码更新。8个全新示例为您的开发保驾护航...
  5. java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置...
  6. [Leetcode][第679题][JAVA][24点游戏][回溯][暴力]
  7. 论文浅尝 | 将字面含义嵌入知识图谱表示学习
  8. python机器学习库sklearn——支持向量机svm
  9. hadoop 3.x 配置历史服务器
  10. 11.05面向对象 封装
  11. 安卓玩java模拟器_安卓系统智能手机玩JAVA游戏!JAVA模拟器让你痛快地玩!
  12. centos系统上实现微信语音amr格式,qq语音slk格式转mp3
  13. C# 电子发票生成pdf
  14. 【运维心得】如何一步切换企业邮箱主域名
  15. mysql数据库反弹端口连接提权
  16. C++入门——Day2_处理数据
  17. Android P Asan使用总结
  18. 英语语音篇 - 自然拼读大全
  19. 爆笑!让你捧腹大笑的标语
  20. 总结HTML中不经常使用的标签

热门文章

  1. 哈工大2018软件构造期末试题答案
  2. Spring注解详解包扫描bean注册
  3. 【USACO 3.2.3】纺车的轮子
  4. 人生得一知己不易,好好珍惜,便成就了永久的情。
  5. 外包项目开发课程整理三:Selfsourcing(自主开发)及 Prototyping(打造原型)
  6. 怎样理解「现金流比利润更重要」?
  7. JEECMS v8 发布,java 开源 CMS 系统
  8. android 车机ui设计,星越L车机初体验,车机流畅功能全,不过也有值得改进之处...
  9. Android控制手电筒代码,简单易用,不需要任何权限
  10. aplication.yml没有图标问题