机器学习其他技术

决策树(Decision Tree)

一种对实例进行分类的树形结构,通过多层判断区分目标所属类别
本质:通过多层判断,从训练数据集中归纳出一组分类规则

优点:

  • 计算量小,运算速度快
  • 易于理解,可清晰查看各属性的重要性

缺点:

  • 忽略属性间的相关性
  • 样本类别分布不均匀时,容易影响模型表现

目标:

  • 根据训练数据集构建一个决策树模型,使它能够对实例进行正确的分类

问题核心:

  • 特征选择,每一个节点,应该选用哪个特征。

决策树求解

信息熵是度量随机变量不确定性的指标,熵越大,变量的不确定性越大。
假设当前样本集合D中第k类样本所占比例为Pk,则D的信息熵为:

划分后样本分布不确定性尽可能小,即划分后信息熵小,信息增益大。
划分前的信息熵-划分后的信息熵,D为当前样本总数,Dv为类别v样本数

在这里插入图片描述

异常检测(Anomaly Detection)

案例:
异常消费检测(商业)
劣质产品检测(工业)
缺陷基因检测(医疗)

根据输入数据,对不符合预期模式的数据进行识别(寻找低概率事件)

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

高斯分布
高斯分布的函数密度函数是:
其中,miu为数据均值,cta为标准差在这里插入图片描述
在这里插入图片描述

基于高斯分布实现异常检测

  • 计算数据均值和标准差
  • 计算对应的高斯分布概率函数
  • 根据数据点概率,进行判断,小于则该点为异常点

主成分分析(PCA)

  • 数据降维
    数据降维,是指在某些限定条件下 ,降低随机变量个数,得到一组“不相关”主变量的过程。

  • 作用:
    减少模型分析数据量,提升处理效率,降低计算难度;
    实现数据可视化。

  • 数据降维的实现:主成分分析(PCA)
    PCA(principal components analysis):数据降维技术中,应用最多的方法
    目标:寻找k(k<n)维新数据,使他们反映事物的主要特征
    核心:在信息损失尽可能少的情况下,降低数据维度
    如何保留主要信息:投影之后的不同特征数据尽可能分得开(即不相关)
    如何实现?使投影后数据的方差最大,因为方差越大数据也越分散

计算过程:

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

决策树实现iris数据分类

#模型训练
#参数选择算法ID3计算节点;节点划分的最低标准
from sklearn import tree
dc_tree=tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5)
dc_tree.fit(X,y)
#可视化决策树:
tree.plot_tree(dc_tree,filled='True',feature_names=[SepalLength','SepalWidth','PetalLength','PetalWidth'],
clsaa_names=['setosa','versicolor','virginica'])

异常数据检测

  • 计算数据均值、标准差:
x1_mean=x1.mean()
   x2_sigma=x1.std()
  • 计算对应的高斯分布数值:
from scipy.stats import norm
x1_range=np.linspace(0,20,300)
normal1=norm.pdf(x1_range,x1_mean,x1_sigma)

scipy官网

  • 可视化高斯分布曲线:
plt,plot(x1_range,normal1)
  • 模型训练:
from sklearn.covariance import EllipticEnvelpoe
clf=EllipticEnvelope()
clf.fit(data)
  • 可视化异常数据:
anamoly_points=plt.scatter(data.loc[:,'x1'][y_predict==-1],data.loc[:,'x2'][y_predict==-1],
marker='o',facecolor="none",edgecolor="red",s=250)

PCA(iris数据降维后分类)

  • 数据标准化预处理:
from sklearn.preprocessing import StandardScaler
X_norm=StandardScaler().fit_transfromo(X)
  • 模型训练获得PCA降维后数据:
from sklearn.decomposition import PCA
#把数据降为4维
pca=PCA(n_components=4)
X_reduced=pca.fit_transfrom(X_norm)
  • 计算各成分投影数据方差比例:
var_ratio=pca.explained_variance_ratio_
  • 可视化方差比例:
plt.bar([1,2,3,4],var_ratio)
plt.title('variance ratio of each component')
plt.xticks([1,2,3,4],['PC1','PC2','PC3','PC4'])
plt.ylabel('var_ratio')
plt.show()
  • 可视化PCA后数据:
setosa=plt.scatter(X_reduced[:,0][y==0],X_reduced[:,1][y==0])
versicolor=plt.scatter(X_reduced[:,0][y==1],X_reduced[:,1][y==1])
virginica=plt.scatter(X_reduced[:,0][y==2],X_reduced[:,1][y==1])

决策树实现iris数据分类

  1. 基于iris_data.csv数据,建立决策树模型,评估模型表现;
  2. 可视化决策树结构;
  3. 修改min_samples_leaf参数,对比模型结果
#加载数据
import pandas as pd
import numpy as np
data=pd.read_csv('iris_data.csv')
data.head()

在这里插入图片描述

#定义X和y
X=data.drop(['target','label'],axis=1)
y=data.loc[:,'label']
print(X.shape,y.shape)

在这里插入图片描述

#评估模型
y_predict=dc_tree.predict(X)
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)

在这里插入图片描述

#可视化树
%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'])

在这里插入图片描述

dc_tree=tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=1)
dc_tree.fit(X,y)
#可视化树
%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'])

在这里插入图片描述

异常数据检测

  1. 基于anomaly_data.csv数据,可视化数据分布情况、及其对应高斯分布的概率密度函数
  2. 建立模型,实现异常检测处理结果
  3. 可视化异常检测处理结果
  4. 修改概率分布阈值
    EllipticEnvelpoe(contamination=0.1)中的contamination,查看阈值改变对结果的影响
#加载数据
import pandas as pd
import numpy as np
data=pd.read_csv('anomaly_data.csv')
data.head()

在这里插入图片描述

#可视化
%matplotlib inline
from matplotlib import pyplot as plt
fig1=plt.figure(figsize=(10,5))
plt.scatter(data.loc[:,'x1'],data.loc[:,'x2'])
plt.title('data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

在这里插入图片描述

#定义x1和x2
x1=data.loc[:,'x1']
x2=data.loc[:,'x2']
fig2=plt.figure(figsize=(20,5))
plt.subplot(121)
plt.hist(x1,bins=100)
plt.title('x1 distribution')
plt.xlabel('x1')
plt.ylabel('counts')
plt.subplot(122)
plt.hist(x1,bins=100)
plt.title('x2 distribution')
plt.xlabel('x2')
plt.ylabel('counts')
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/w3222371135/article/details/108308496