目录
1.从sklearn中提取模块
2.算法思路
3.代码实现
编辑:
校对:
版本:
WangXin
WangXin
python3
从sklearn中提取模块
本小节中还是使用sklearn包中的二元决策树函数DecisionTreeRegressor作为主要的分析函数。另外还需要说明两个随机函数:
random.choice(range(n)):在range形成的列表里面随机抽取一个
random.sample(range(n),m):在range形成的列表里面无重复的随机抽取m个数
算法思路
该算法的核心就是如何实现以下两个步骤,过程如下:
(1)有放回的随机抽取样本数据
a)定义一个需要抽取的数据的索引列表
b)使用随机函数随机生成和数据集同样大小的数值填充到索引列表中
c)对数据索引列表排序
d)抽取包含在索引列表中的数据重新组成样本集,并抽取对应的标签值组成标签集
(2)无放回的随机抽取属性列
a)定义一个需要抽取的属性的索引列表
b)使用随机函数随机生成和属性数量同样大小的数值填充到索引列表中
c)对属性索引列表排序
d)抽取包含在属性索引列表中的属性重新组成属性集
(3)从新的样本集中按照新的属性集抽取样本数据集及标签值,然后进行分析
代码实现
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.tree import DecisionTreeRegressor
import random
##运行脚本所在目录
base_dir=os.getcwd()
data=np.loadtxt(base_dir+r"\mydata.txt",delimiter=";")
dataLen = len(data) ##矩阵的数
dataWid = len(data[0]) ##矩阵的列数
#第一步:划分训练集和测试集
##测试集大小:这里选择30%作为测试集,70%作为训练集
nSample = int(dataLen * 0.30)
##在0~dataLen直接随机生成nSample个点
idxTest = random.sample(range(dataLen), nSample)
idxTest.sort()
#定义训练集和测试集标签
xTrain = [] #训练集
xTest = [] #测试集
yTrain = [] #训练集标签
yTest = [] #测试集标签
##划分数据:
for i in range(dataLen):
row = data[i]
if i not in idxTest:
xTrain.append(row[0:dataWid-1])
yTrain.append(row[-1])
else :
xTest.append(row[0:dataWid-1])
yTest.append(row[-1])
#第二步:使用随机森林算法训练数据
modelList = [] ##决策树的个数
predList = [] ##预测值列表
mse = [] ##均方差列表
allPredictions = [] ##预测值累加和列表
numTreesMax = 100 ##最大树数目
treeDepth = 12 ##每个树的深度
nAttr = 4 ##随机抽取的属性数目,建议值:回归问题1/3
for iTrees in range(numTreesMax):
##定义决策树
modelList.append(DecisionTreeRegressor(max_depth=treeDepth))
##随机抽取的样本数据集和标签集
xList = []
yList = []
##进行随机抽取时样本数据集的索引列表和属性索引列表
idxList = []
attList = []
##构造随机样本数据集的索引列表
for idx in range(len(xTrain)):
idxList.append(random.choice(range(len(xTrain))))
idxList.sort() ##记得排序
##构造随机样本数据集
for idx in idxList:
xList.append(xTrain[idx])
yList.append(yTrain[idx])
##构造随机属性列表:dataWid-1,是因为最后一列是标签值
attList = random.sample(range(dataWid - 1), nAttr)
attList.sort() ##记得排序
##构造测试数据集
xTrain1 = []
yTrain1 = []
for i in range(len(xList)):
##只读取抽取到的列
row = [xList[i][j] for j in attList]
xTrain1.append(row)
##yList每行只有一个标签值
yTrain1.append(yList[i])
##开始训练
modelList[-1].fit(xTrain1, yTrain1)
##获取预测值 ---测试集需要抽取相同的列进行预测
xTest1 = []
for i in range(len(xTest)):
##只读取抽取到的列
row = [xTest[i][j] for j in attList]
xTest1.append(row)
latestOutSamplePrediction = modelList[-1].predict(xTest1)
##预测值添加到列表
predList.append(list(latestOutSamplePrediction))
复制
学而不思则罔
根据算法思路设计代码实现随机森林算法功能

理解编程语言,探索数据奥秘
每日练习|干货分享|新闻资讯|公益平台。
每天学习一点点,你将会见到全新的自己。

长按识别二维码关注
