机器学习—决策树

信息熵

小白的机器学习学习笔记 2024/5/14 15:06

比特化

等概率时花费的时间比较多

随机变量不是等概率出现的时候,bit更小,传输速率更快

在这里插入图片描述

在等概率情况下,具体是哪个意思比较难猜,每个可能都是等概率,很难猜中具体是哪个,信息量就很大

举个我自己理解的小栗子:

“你去刷碗” :很具体,就是就是刷碗这件事,信息熵就小

“你猜猜我想让你干什么?” :这就很模糊,信息量大,信息熵就大

信息熵就是用来描述系统信息量的不确定度

信息熵越小就越纯

条件熵

在这里插入图片描述

决策树

可以按照gini系数或者信息熵来做决策树

按照样本的每一列来构造一个树,然后通过这个树来决定和判断这个样本的类型

在这里插入图片描述

在这里插入图片描述

每个叶子结点都代表一个类别

决策树是一个有监督的分类算法

决策树分两大类,分类树和回归树

信息熵:熵值越小,越容易区分

在这里插入图片描述

在这里插入图片描述

决策树量化纯度

在这里插入图片描述

Gain越大,表示用这个条件分越纯,越合理

在这里插入图片描述

由上图可见,收入的信息增益Gain最大,先用收入来分

决策树生成算法

建立决策树的主要是以下三种算法
◆ID3
◆C4.5
CART ( Classification And Regression Tree )

ID3

在这里插入图片描述

C4.5

在这里插入图片描述

在这里插入图片描述

CART

在这里插入图片描述

分类示例

步骤

  1. 数据加载

  2. 数据处理(这里用了降维)

  3. 数据分割(分割成训练集和测试集)

  4. 创建并训练模型

  5. 模型评估

    5.1 生成不同种类的样本数据

    5.2 对数据进行预测

    5.3 构建3中颜色map对象

    5.4 显示3种背景

    5.5 画训练集样本

    5.6 画测试集样本

  6. 画ROC曲线

代码

#coding=UTF-8
import numpy as np
import pandas as pd
defaultencoding = 'utf-8'
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
#1.数据加载
datas=pd.read_csv("iris.data",header=None,sep=",")#加载数据
X=datas.iloc[:,0:-1]#取x
Y=datas.iloc[:,-1]#最后一列
Y=pd.Categorical(Y).codes#编码
# 在数据分析中,经常需要对分类数据进行编码,即将非数值型的数据转换为数值型的数据,以便进行数据分析和建模。Pandas库中提供了Categorical类型,可以方便地进行分类变量的转换和管理。
# 其中,pd.Categorical(Y).codes可以将分类变量Y转换为数值型变量,并返回一个由整数组成的数组。
# 其中,每个整数都对应于相应分类变量的唯一编码。
#
# 举个例子,如果我们有一个包含颜色信息的分类变量Y,其中包含了"red"、"green"和"blue"三种颜色,
# 我们可以使用pd.Categorical(Y).codes将其转换为对应的整数编码,
# 比如"red"对应的编码为0,"green"对应的编码为1,"blue"对应的编码为2。


#2.数据处理 降维
#Laso 求出来theta为0
#主成分析:降维
from sklearn.decomposition import PCA#降维
# 通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维
pca=PCA(n_components=2)#n_components表示降成2个特征列
X=pca.fit_transform(X)#转换成2列
#3.数据分割
from sklearn.model_selection import train_test_split#训练集测试集分割
train_x,test_x,train_y,test_y=train_test_split(X,Y,test_size=0.2,random_state=2)
#4.创建模型并训练模型
from sklearn.tree import DecisionTreeClassifier#导入决策树分类
# DecisionTreeClassfier的参数有
  # 1.criterion  gini  or  entropy
  # 2.splitter  best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)
  # 3.max_features  默认是None(所有),log2,sqrt,N  特征小于50的时候一般使用所有的
  # #N就是特征属性的个数
  # 4.max_depth  数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下
  # #防止过拟合
  # 5.min_samples_split  如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
  #                      如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
  # 6.min_samples_leaf  这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被
  #                     剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下
  # 7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起
  #                         被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,
  #                         或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
  # 8.max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。
  #                  如果加了限制,算法会建立在最大叶子节点数内最优的决策树。
  #                  如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制
  #                  具体的值可以通过交叉验证得到。
  # 9.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多
  #                导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重
  #                如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
  # 10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度
  #                      (基尼系数,信息增益,均方差,绝对差)小于这个阈值
  #                      则该节点不再生成子节点。即为叶子节点 。
# best表示当前数据集是最优,但将来的数据集不一定最优,所以可选 random max_features最多选几个特征(列)
decision_tree=DecisionTreeClassifier(criterion="gini",splitter="random",max_features=2,random_state=2)#这里选择用gini系数来构建决策数
decision_tree.fit(train_x,train_y)#fit用来决策树构建
#预测
# test_y_hat=decision_tree.predict(test_x)#预测:分类:多数表决法,或加权多数表决法
#4.模型评估
score=decision_tree.score(test_x,test_y)#这个方法会返回该模型下的准确率
#求R^2 接近于1更好
# 4.1生成样本数据
# print proba
#得到第0列最大值 最小值
minx1=np.min( X[:,0])
maxx1=np.max( X[:,0])
#得到第1列最大值 最小值
minx2=np.min( X[:,1])
maxx2=np.max( X[:,1])
#
N=100
#根据原数据第0列,最大值,最小值成生100个数据
X1=np.linspace(minx1,maxx1,100)#生成X第一列最大值和最小值之间100个值
#根据原数据第1列最大值,最小值成生100个数据
X2=np.linspace(minx2,maxx2,100)#生成X第二列最大值和最小值之间100个值

#生坐标点
X1,X2=np.meshgrid(X1,X2)
#合成2列数据 一万行数据(100*100)
grid_X=np.dstack((X1.ravel(),X2.ravel()))[0]#ravel把二维数组变成一维数组
# 4.2对一万数据进行预测
grid_hat=decision_tree.predict(grid_X) #预测

#4.3构建3种颜色map对象
c=mpl.colors.ListedColormap(['aliceblue', 'antiquewhite', 'aqua'])#取pthon颜色前3个
plt.figure()
plt.subplot(2,1,1)#显示第一个子图
print("========================")
print(X1.shape,0000000)
#第三个参数是颜色
#4.4显示3种背景
plt.pcolormesh(X1,X2,grid_hat.reshape(X1.shape),cmap=c)#显示3块背景
# plt.pcolormesh(X1,X2,grid_hat.reshape(X1.shape),cmap=c)是一种用于可视化分类边界的方法,
# 其中X1和X2是两个特征的网格点坐标矩阵,grid_hat是分类器预测的结果,cmap是颜色映射方案。
# 这个函数将会把grid_hat的值根据颜色映射方案显示在网格坐标(X1,X2)对应的位置上,从而形成分类的背景。
#
# 更具体地说,plt.pcolormesh()函数的作用是对网格坐标中每个小矩形(由相邻的四个点围成)进行填充颜色,颜色的深浅取决于grid_hat预测结果的值。
# 因此,如果分类器能够很好地区分不同的类别,则可以看到3块不同颜色的背景。
#
# 需要注意的是,X1、X2和grid_hat都是二维数组,因此需要使用reshape()函数将grid_hat从一维数组变成和X1、X2相同的二维数组,以便正确绘制分类背景。

# 4.5画原训练样本
plt.scatter(train_x[:,0],train_x[:,1],c=train_y)#显示训练集点
# 这是一个使用 matplotlib 库中的 scatter 方法进行绘图的例子。
# 其中 train_x[:,0] 和 train_x[:,1] 是训练集中所有样本的第一列和第二列特征,train_y 是训练集中所有样本的标签。
# scatter 方法将第一列特征作为 x 轴,第二列特征作为 y 轴,根据标签 train_y 对数据点进行颜色编码,最终显示出一个二维散点图,其中不同颜色的点代表不同的类别。
# 
# 具体而言,plt.scatter(train_x[:,0],train_x[:,1],c=train_y) 中的参数 train_x[:,0] 表示取训练集中所有样本的第一列特征作为 x 轴数据;
# train_x[:,1] 表示取训练集中所有样本的第二列特征作为 y 轴数据;c=train_y 表示根据 train_y 中不同的标签对散点图上的数据点进行颜色编码。


# 4.6画原测试集样本
plt.scatter(test_x[:,0],test_x[:,1],c=test_y)#显示测试集点
plt.title("决策树算法 准确率"+str(score))
#5.画ROC曲线
plt.subplot(2,1,2)#显示第二个子图
import sklearn.metrics as metrics
from sklearn.preprocessing import label_binarize
proba=decision_tree.predict_proba(test_x)#求概率
lbl=label_binarize(test_y,classes=(0,1,2))
fpr,tpr,tharehold=metrics.roc_curve(lbl.ravel(),proba.ravel())
plt.plot(fpr,tpr,c="red")#ROC
plt.title("AUC:"+str(metrics.auc(fpr,tpr)))
plt.show()

结果

在这里插入图片描述

并不是列数越多越好,容易造成过拟合,得适中

Lasso回归里面,求出来theta为0,就是降维操作

这里用的是PCA降维

数据预览

在这里插入图片描述

回归示例

代码

#coding=UTF-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression,RidgeCV,LassoCV
from sklearn.preprocessing import StandardScaler
import matplotlib as mpl
import sys
defaultencoding = 'utf-8'

mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
# CRIM - per capita crime rate by town 城镇人均犯罪率
# ZN - proportion of residential land zoned for lots over 25,000 sq.ft.占地面积超过25000平方英尺的住宅用地比例。
# INDUS - proportion of non-retail business acres per town.每个城镇非零售商业用地的比例
# CHAS - Charles River dummy variable (1 if tract bounds river; 0 otherwise) Charles River虚拟变量(如果tract bounds river,则为1;否则为0)
# NOX - nitric oxides concentration (parts per 10 million)一氧化氮浓度(百万分之一)
# RM - average number of rooms per dwelling每个住宅的平均房间数
# AGE - proportion of owner-occupied units built prior to 19401940年以前建设的业主单位比例
# DIS - weighted distances to five Boston employment centres 到波士顿五个就业中心的加权距离
# RAD - index of accessibility to radial highways 放射状公路可达性指标
# TAX - full-value property-tax rate per $10,000 每10000美元的全额物业税税率
# PTRATIO - pupil-teacher ratio by town 城镇师生比
# B - 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town1000(bk-0.63)^2,其中bk是按城镇划分的黑人比例
# LSTAT - % lower status of the population 人口地位低下状态
datas=pd.read_csv("boston_housing.data",sep=",",header=None)
datas=datas.replace(np.NaN,0)
datas=datas.dropna(axis=1,how="any")
X=datas.iloc[:,1:-1]
Y=datas.iloc[:,-1]
# print Y
train_x,test_x,train_y,test_y=train_test_split(X,Y,test_size=0.2,random_state=2)
#决策树,训练、预测值、算分数
decisionTree=DecisionTreeRegressor(criterion="friedman_mse",splitter="random",min_samples_leaf=4)
decisionTree.fit(train_x,train_y)
decisionTree_y_hat=decisionTree.predict(test_x)
print(decisionTree.score(test_x,test_y))
#线性回归,训练、预测值、算分数
linear=LinearRegression()
linear.fit(train_x,train_y)
linear_y_hat=linear.predict(test_x)
# print linear.score(test_x,test_y)
#岭回归,训练、预测值、算分数
ridge=RidgeCV(alphas=np.logspace(-3,1,20),cv=2)
ridge.fit(train_x,train_y)
ridge_x_hat=ridge.predict(test_x)
ridge_score=ridge.score(test_x,test_y)
#lasso回归,训练、预测值、算分数
lasso=LassoCV(alphas=np.logspace(-3,1,20),cv=2)
lasso.fit(train_x,train_y)
lasso_x_hat=lasso.predict(test_x)
lasso_score=lasso.score(test_x,test_y)
#开始画图
plt.figure()
r=range(len(test_x))
import matplotlib.colors as colors
print(colors.cnames.keys())
plt.plot(r,test_y,c="blue",label="原始数据")
plt.plot(r,decisionTree_y_hat,c="red",label="决策树:"+str(decisionTree.score(test_x,test_y)))
plt.plot(r,linear_y_hat,c="firebrick",label="线性回归:"+str(linear.score(test_x,test_y)))
plt.plot(r,ridge_x_hat,c="gold",label="岭回归"+str(ridge_score))
plt.plot(r,lasso_x_hat,c="black",label="lasso回归:"+str(lasso_score))
plt.legend()
plt.show()

结果

在这里插入图片描述

数据预览

在这里插入图片描述

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值