热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

备战数学建模43决策树随机森林Logistic模型(攻坚站7)

决策树(DecisionTree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险&#x

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。随机森林 (Random forest)[5] 是由美国科学家 Leo Breiman 将其在 1996 年提出的
Bagging 集成学习理论 与 Ho 在 1998 年提出的随机子空间方法相结合,于 2001 年发
表的一种机器学习算法。logistic回归又称logistic回归分析,主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。例如,想探讨胃癌发生的危险因素,可以选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群肯定有不同的体征和生活方式等。这里的因变量就是是否胃癌,即“是”或“否”,为两分类变量,自变量就可以包括很多了,例如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。通过logistic回归分析,就可以大致了解到底哪些因素是胃癌的危险因素。

目录

一、决策树

1.1、决策树算法概述

1.2、熵值的作用

1.3、决策树构造实例

1.4、信息增益率与gini系数

 1.5、剪枝的方法

 1.6、决策树实验案例及分析

二、随机森林

2.1、随机森林的算法原理

2.2、随机森林的优势与特征重要指标

 2.3、随机森林的分类过程

2.4、随机森林的实验案例及分析

三、Logistic模型

3.1、Logistic模型理论

3.2、SPSS求解逻辑回归



一、决策树


1.1、决策树算法概述

决策树就是从根节点到叶子节点一步步做决策的模型,最终所有的决策都会落在叶子节点,这样该模型既可以做分类,也可以做回归。决策树有严格的先后顺序,每次决策类型的顺序不能发生改变,在前面的节点的重要性要比在后面的节点的重要性要高,

决策树的组成如下:从根节点到叶子节点,最终的决策在叶子节点。

 决策树的训练:根据数据构造决策树,测试:有了决策树后从上到下走一遍。

1.2、熵值的作用

我们在构造决策树的时候需要根据特征的重要性进行切分,即根据区分效果划分节点,那么如何衡量每个特征的重要性呢?一般使用熵值去衡量。

 我们使用熵值去衡量决策树特征的好坏,熵值越小,说明越确定,即相对稳定,

 选择信息熵小的,使得按该特征分类后的该类的不确定性程度减小的多。

1.3、决策树构造实例

有一份数据包含14天打球情况,根据已有的数据,根据4种环境变化特征构建一个决策树,判断未来某一天的环境下是否去打球。

现在根据数据基于下面四个特征进行决策树划分,我们首先需要找到根节点,四个特征谁当根节点最好呢?当然是信息熵越小的越好,即信息增益越大越好,也就是max(原始信息熵-以该特征为节点的信息熵).

在计算各个特征的信息熵之前,我们需要对原始数据的信息熵进行计算,然后才能计算信息增益,基于play进行计算,14天有9天打球,5天不打球,代入公式得到信息熵为0.94.那么在此基础上,要分别计算基于其余特征的划分情况下的信息熵。

我们计算得到基于天气的熵值为0.693,则信息增益是0.247.然后同样的方法计算出基于温度的信息增益,基于湿度的信息增益,基于是否有风的信息增益,最后将信息增益最后的特征作为根节点,然后按照同样的方式划分下层节点。

1.4、信息增益率与gini系数

我们常用的决策树算法是ID3,C4.5,CART,如下所示:基尼系数的值越小,则效果越好。

 1.5、剪枝的方法

为了防止数据出现过拟合的情况,即在训练集表现很好,在测试集表现的并不好。则需要进行剪枝,主要有预剪枝和后剪枝,预剪枝在建立决策树的过程中剪枝,后剪枝是建立完树后剪枝。

对于预剪枝的策略,一般通过限制深度,叶子节点个数,信息增益量等方法去剪枝,如果是后剪枝方法,需要根据公式进行衡量是否进行剪枝。

 1.6、决策树实验案例及分析

构建决策树的方法主要有三种:ID3,C4.5,CART。

首先我们使用14组环境数据作为数据集,前12组用来训练构造树,后2组用来预测。

我们可以先看一下效果,构建的决策树和最后两组的预测结果如下:

 

我们再换用如下西瓜数据集进行训练和测试,构建的决策树和测试结果如下: 

 具体的matlab代码如下:

主函数代码如下:

clear
clc
load('watermelon.mat')%load('datas.mat')
%watermelon = datas ;
size_data = size(watermelon); %watermelon2为导入工作台的数据%分为训练集和测试集
x_train = watermelon(1:size_data(1)-2,:) %这里加上了属性标签行
x_test = watermelon(size_data(1)-1:end,1:size_data(2)-1); %选择最后两个当测试集%训练
size_data = size(x_train);
dataset = x_train(2:size_data(1),:); %纯数据集
labels = x_train(1,1:size_data(2)-1); %属性标签%生成决策树
mytree = ID3(dataset,labels);
[nodeids,nodevalue,branchvalue] = print_tree(mytree);
tree_plot(nodeids,nodevalue,branchvalue);
predict(x_test,mytree,x_train(1,1:end-1))

 构建决策树代码如下:

function myTree = ID3(dataset,labels)
% ID3算法构建决策树
% 输入参数:
% dataset:数据集
% labels:属性标签
% 输出参数:
% tree:构建的决策树
size_data = size(dataset);
classList = dataset(:,size_data(2)); %得到标签%全为同一类,熵为0
if length(unique(classList))==1myTree = char(classList(1));return
end%去除完全相同的属性,避免产生没有分类结果的节点
% choose=ones(1,size_data(2));
% for i=1:(size_data(2)-1)
% featValues = dataset(:,i);
% uniqueVals = unique(featValues);
% if(length(uniqueVals)<&#61;1)
% choose(i)&#61;0;
% end
% end
% labels&#61;labels((choose(1:size_data(2)-1))&#61;&#61;1);
% dataset&#61;dataset(:,choose&#61;&#61;1);size_data &#61; size(dataset);
classList &#61; dataset(:,size_data(2));%%属性集为空&#xff0c;用找最多数
if size_data(2) &#61;&#61; 1temp&#61;tabulate(classList);value&#61;temp(:,1); %属性值count&#61;cell2mat(temp(:,2)); %不同属性值的各自数量index&#61;find(max(count)&#61;&#61;count);choose&#61;index(randi(length(index)));myTree &#61; char(value(choose));return
end%bestFeature &#61; chooseFeature(dataset); %找到信息增益最大的特征
bestFeature &#61; chooseFeatureGini(dataset); %找到信息增益最大的特征
bestFeatureLabel &#61; char(labels(bestFeature)); %得到信息增益最大的特征的名字&#xff0c;即为接下来要删除的特征
myTree &#61; containers.Map;
leaf &#61; containers.Map;
featValues &#61; dataset(:,bestFeature);
uniqueVals &#61; unique(featValues);labels&#61;[labels(1:bestFeature-1) labels(bestFeature&#43;1:length(labels))]; %删除该特征%形成递归&#xff0c;一个特征的按每个类别再往下分
for i&#61;1:length(uniqueVals)subLabels &#61; labels(:)&#39;; value &#61; char(uniqueVals(i));subdata &#61; splitDataset(dataset,bestFeature,value); %取出该特征值为value的所有样本,并去除该属性leaf(value) &#61; ID3(subdata,subLabels);myTree(char(bestFeatureLabel)) &#61; leaf;
endend

构建决策树过程中根据基尼指数选择特征的代码&#xff1a;

function bestFeature&#61;chooseFeatureGini(dataset,~)
% 选择基尼指数最小的属性特征%数据预处理
[N,M]&#61;size(dataset); %样本数量N
M&#61;M-1; %特征个数M
y&#61;strcmp(dataset(:,M&#43;1),dataset(1,M&#43;1)); %标签y(以第一个标签为1)
x&#61;dataset(:,1:M); %数据x
Gini_index &#61; zeros(1,M); %创建一个数组&#xff0c;用于储存每个特征的信息增益
%bestFeature; %最大基尼系数的特征%计算基尼指数
for i&#61;1:M% 计算第i种属性的基尼指数temp&#61;tabulate(x(:,i));value&#61;temp(:,1); %属性值count&#61;cell2mat(temp(:,2)); %不同属性值的各自数量Kind_Num&#61;length(value); %取值数目Gini&#61;zeros(Kind_Num,1);% i属性下 j取值的基尼指数for j&#61;1:Kind_Num% 在第j种取值下正例的数目Gini(j)&#61; getGini( y(strcmp(x(:,i),value(j))) );endGini_index(i)&#61;count&#39;/N*Gini;
end
%随机挑选一个最小值
min_GiniIndex&#61;find(Gini_index&#61;&#61;min(Gini_index));
choose&#61;randi(length(min_GiniIndex));
bestFeature&#61;min_GiniIndex(choose);
end

计算基尼指数的代码如下&#xff1a;

function Gini &#61; getGini(y)
% 计算基尼系数
% y对应的标签,为1或0&#xff0c;对应正例与反例
%%%%%%&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;N&#61;length(y); %标签长度P_T&#61;sum(y)/N; %正例概率P_F&#61;1-P_T; %正例概率Gini&#61;1-P_T*P_T-P_F*P_F; %基尼系数
%%%%%%&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
end

构造决策树的过程中&#xff0c;划分数据集的方法&#xff1a;

function subDataset &#61; splitDataset(dataset,axis,value)
%划分数据集&#xff0c;axis为某特征列&#xff0c; 取出该特征值为value的所有样本,并去除该属性subDataset &#61; {};
data_size &#61; size(dataset);%取 该特征列 该属性 对应的数据集
for i&#61;1:data_size(1)data &#61; dataset(i,:);if strcmp(cellstr(data(axis)),cellstr(value))subDataset &#61; [subDataset;[data(1:axis-1) data(axis&#43;1:length(data))]]; %取 该特征列 该属性 对应的数据集end
end
end

遍历决策树的方法&#xff1a;

function [nodeids_,nodevalue_,branchvalue_] &#61; print_tree(tree)
% 层序遍历决策树&#xff0c;返回nodeids&#xff08;节点关系&#xff09;&#xff0c;nodevalue&#xff08;节点信息&#xff09;&#xff0c;branchvalue&#xff08;枝干信息&#xff09;
nodeids(1) &#61; 0;
nodeid &#61; 0;
nodevalue&#61;{};
branchvalue&#61;{};queue &#61; {tree} ; %形成队列&#xff0c;一个一个进去
while ~isempty(queue)node &#61; queue{1};queue(1) &#61; []; %在队列中除去该节点if strcmp(cellstr(class(node)),&#39;containers.Map&#39;) &#61;&#61; 0 %叶节点的话&#xff08;即走到底了&#xff09;nodeid &#61; nodeid&#43;1;nodevalue &#61; [nodevalue,{node}];elseif length(node.keys)&#61;&#61;1 %节点的话nodevalue &#61; [nodevalue,node.keys]; %储存该节点名node_info &#61; node(char(node.keys)); %储存该节点下的属性对应的mapnodeid &#61; nodeid&#43;1;branchvalue &#61; [branchvalue,node_info.keys]; %每个节点下的属性for i&#61;1:length(node_info.keys)nodeids &#61; [nodeids,nodeid];endendif strcmp(cellstr(class(node)),&#39;containers.Map&#39;)keys &#61; node.keys();for i &#61; 1:length(keys)key &#61; keys{i};queue&#61;[queue,{node(key)}]; %队列变成该节点下面的节点endend
nodeids_&#61;nodeids;
nodevalue_&#61;nodevalue;
branchvalue_ &#61; branchvalue;
end

绘制决策树的方法&#xff1a;
 

function tree_plot(p,nodevalue,branchvalue)
% 参考treeplot[x,y,h] &#61; treelayout(p); %x:横坐标&#xff0c;y:纵坐标&#xff1b;h:树的深度
f &#61; find(p~&#61;0); %非0节点
pp &#61; p(f); %非0值
X &#61; [x(f); x(pp); NaN(size(f))];
Y &#61; [y(f); y(pp); NaN(size(f))];X &#61; X(:);
Y &#61; Y(:);n &#61; length(p);
if n<500hold on;plot(x,y,&#39;ro&#39;,X,Y,&#39;r-&#39;)nodesize &#61; length(x);for i&#61;1:nodesizetext(x(i)&#43;0.01,y(i),nodevalue{1,i}); endfor i&#61;2:nodesizej &#61; 3*i-5;text((X(j)&#43;X(j&#43;1))/2-length(char(branchvalue{1,i-1}))/200,(Y(j)&#43;Y(j&#43;1))/2,branchvalue{1,i-1})endhold off
elseplot(X,Y,&#39;r-&#39;);
end
xlabel([&#39;height &#61; &#39; int2str(h)]);
axis([0 1 0 1]);
end

测试集进行预测的方法&#xff1a;

function y_test&#61;predict(x_test,mytree,feature_list)
%测试y_test &#61; {};
row &#61; size(x_test);for j&#61; 1:row(1)queue &#61; {mytree}; %形成队列&#xff0c;一个一个进去feature_name &#61; 0;feature &#61; 0;while ~isempty(queue)node &#61; queue{1};queue(1) &#61; []; %在队列中除去该节点tag &#61; 2;if strcmp(cellstr(class(node)),&#39;containers.Map&#39;) &#61;&#61; 0%叶节点的话&#xff08;即走到底了&#xff09;y_test{j} &#61; node; %走到底就是我们需要的标签continueelseif length(node.keys)&#61;&#61;1 %节点的话feature_name &#61; char(node.keys); %得到mytree节点的名字id &#61; ismember(feature_list,feature_name); %mytree该特征所在的坐标x &#61; x_test(j,:);feature &#61; x(id); %得到测试数据的特征属性tag &#61; 1; end%tag&#61;&#61;2 即要走入下个节点if tag&#61;&#61;2if strcmp(cellstr(class(node)),&#39;containers.Map&#39;)hasKeys&#61;0;keys &#61; node.keys();for i &#61; 1:length(keys)key &#61; keys{i};c &#61; char(feature);if strcmp(key,c)queue&#61;[queue,{node(key)}]; %队列变成该节点下面的节点hasKeys&#61;1;endendif(~hasKeys)key &#61; keys{randi(length(keys))};queue&#61;[queue,{node(key)}]; %队列变成该节点下面的节点endendend%tag&#61;&#61;1 即要选则符合测试数据的特征属性&#xff0c;这样就不用历遍整个mytreeif tag&#61;&#61;1if strcmp(cellstr(class(node)),&#39;containers.Map&#39;)keys &#61; node.keys();for i &#61; 1:length(keys)key &#61; keys{i};queue&#61;[queue,{node(key)}]; %队列变成该节点下面的节点endendendendif length(y_test)endend

二、随机森林


2.1、随机森林的算法原理

我们首先看卡集成算法&#xff0c;也可以叫集成学习&#xff0c;目的是让机器的学习效果更好&#xff0c;常见的又bagging&#xff0c;boosting和stacking&#xff0c;其中bagging是训练多个取平均值&#xff0c;boosting是训练多个组合加权&#xff0c;stacking是聚合多个分类&#xff0c;就是融合多个算法。

 我们看一下Bagging模型&#xff0c;典型的Bagging模型就是随机森林&#xff0c;并行的训练一堆分类器&#xff0c;数据随机采样&#xff0c;特征选择随机&#xff0c;建立多个决策树&#xff0c;即多个分类器&#xff0c;将多个分类器放到一起就组成了森林。

通过2重随机性&#xff0c;就是随机采样&#xff0c;随机获取特征&#xff0c;使得构造的决策树具有多样性&#xff0c;最后的平均才能取得更好的效果&#xff0c;更具有说服力。

2.2、随机森林的优势与特征重要指标

随机森林的可解释性很强&#xff0c;神经网络虽然也可以用来预测和分类&#xff0c;但是神经网络的隐含层不具有可解释性&#xff0c;我们只知道输入和输出&#xff0c;具体内部怎么做的&#xff0c;细节无从得知。随机森林方便进行可视化展示&#xff0c;可以自动做特征筛选&#xff0c;并行速度较快。

对于随机森林中决策树的个数应该为多少个呢&#xff0c;我们看这个图&#xff0c;可以发现当决策树达到一定的数量&#xff0c;准确率就趋于稳定了。

 2.3、随机森林的分类过程

训练随机森林的过程就是训练各个决策树的过程&#xff0c;由于各个决策树的训练是相互独立的&#xff0c;因此随机森林的训练可以通过并行处理来实现&#xff0c;这将大大提高生成模型的效率。当输入待分类样本时&#xff0c;随机森林输出的分类结果由每个决策树的分类结果简单投票决定&#xff0c;随机森林的思想是&#xff1a;随机选取样本构造决策树&#xff0c;随机选取特征进行分裂。

随机森林的最终分类结果是取众数的方式&#xff0c;或者理解为取平均的方式。

分类过程可以近似表示为如下&#xff1a;

 

2.4、随机森林的实验案例及分析

我们先看一下我用的数据集&#xff0c;我用的还是上面决策树案例用到的根据环境状况判断是否打球的数据集合&#xff0c;14组数据。

 

第一步&#xff1a;确定决策树的个数和决策树叶子节点数量&#xff0c;其中&#xff0c;RFOptimizationNum是为了多次循环&#xff0c;防止最优结果受到随机干扰&#xff1b;大家如果不需要&#xff0c;可以将这句话删除。

       这里决策树的个数设置1~500&#xff0c;在这个范围内寻找最合适的决策树个数。
  RFLeaf定义初始的叶子节点个数&#xff0c;我这里设置了从5到500&#xff0c;也就是从5到500这个范围内找到最优叶子节点个数。
  Input与Output分别是我的输入&#xff08;自变量&#xff09;与输出&#xff08;因变量&#xff09;&#xff0c;大家自己设置即可。
 

clc
clear
load(&#39;data1.mat&#39;)
Input &#61; data1(2:end,1:end-1)
Output &#61; data1(2:end,end)
%% 确定叶子节点和决策树的数量
for RFOptimizationNum&#61;1:5
RFLeaf&#61;[5,10,20,50,100,200,500];
col&#61;&#39;rgbcmyk&#39;;
figure(&#39;Name&#39;,&#39;RF Leaves and Trees&#39;);
for i&#61;1:length(RFLeaf)RFModel&#61;TreeBagger(500,Input,Output,&#39;Method&#39;,&#39;R&#39;,&#39;OOBPrediction&#39;,&#39;On&#39;,&#39;MinLeafSize&#39;,RFLeaf(i));plot(oobError(RFModel),col(i));hold on
end
xlabel(&#39;Number of Grown Trees&#39;);
ylabel(&#39;Mean Squared Error&#39;) ;
LeafTreelgd&#61;legend({&#39;5&#39; &#39;10&#39; &#39;20&#39; &#39;50&#39; &#39;100&#39; &#39;200&#39; &#39;500&#39;},&#39;Location&#39;,&#39;NorthEast&#39;);
title(LeafTreelgd,&#39;Number of Leaves&#39;);
hold off;
disp(RFOptimizationNum);
end

我们从图中分析可以发现这个数据集选5个叶子节点&#xff0c;决策树的数量选取200左右就可以。其实由于该数据集数量较少&#xff0c;总的来说&#xff0c;决策树的叶子数量选取产生的误差相差不大。

选择好决策树的个数和叶子节点数&#xff0c;后面就可以对数据集进行划分&#xff0c;然后建立随机森林进行分类预测&#xff0c;可以计算出预测误差和每个特征的重要性排名&#xff0c;重要性越大&#xff0c;说明该特征对分类的作用越好。

clc
clear
load(&#39;data1.mat&#39;)
Input &#61; data1(2:end,1:end-1) ;
Output &#61; data1(2:end,end) ;
% %% 确定叶子节点和决策树的数量
% for RFOptimizationNum&#61;1:5
% RFLeaf&#61;[5,10,20,50,100,200,500];
% col&#61;&#39;rgbcmyk&#39;;
% figure(&#39;Name&#39;,&#39;RF Leaves and Trees&#39;);
% for i&#61;1:length(RFLeaf)
% RFModel&#61;TreeBagger(500,Input,Output,&#39;Method&#39;,&#39;R&#39;,&#39;OOBPrediction&#39;,&#39;On&#39;,&#39;MinLeafSize&#39;,RFLeaf(i));
% plot(oobError(RFModel),col(i));
% hold on
% end
% xlabel(&#39;Number of Grown Trees&#39;);
% ylabel(&#39;Mean Squared Error&#39;) ;
% LeafTreelgd&#61;legend({&#39;5&#39; &#39;10&#39; &#39;20&#39; &#39;50&#39; &#39;100&#39; &#39;200&#39; &#39;500&#39;},&#39;Location&#39;,&#39;NorthEast&#39;);
% title(LeafTreelgd,&#39;Number of Leaves&#39;);
% hold off;
% disp(RFOptimizationNum);
% end
%% 循环准备
RFScheduleBar&#61;waitbar(0,&#39;Random Forest is Solving...&#39;);
RFRMSEMatrix&#61;[];
RFrAllMatrix&#61;[];
RFRunNumSet&#61;5000;
for RFCycleRun&#61;1:RFRunNumSet%% 训练集和测试集的划分
RandomNumber&#61;(randperm(length(Output),floor(length(Output)*0.2)))&#39;;
TrainYield&#61;Output;
TestYield&#61;zeros(length(RandomNumber),1);
TrainVARI&#61;Input;
TestVARI&#61;zeros(length(RandomNumber),size(TrainVARI,2));
for i&#61;1:length(RandomNumber)m&#61;RandomNumber(i,1);TestYield(i,1)&#61;TrainYield(m,1);TestVARI(i,:)&#61;TrainVARI(m,:);TrainYield(m,1)&#61;0;TrainVARI(m,:)&#61;0;
end
TrainYield(all(TrainYield&#61;&#61;-2,2),:)&#61;[];
TrainVARI(all(TrainVARI&#61;&#61;-2,2),:)&#61;[];
end%% 随机森林
nTree&#61;200;
nLeaf&#61;5;
RFModel&#61;TreeBagger(nTree,TrainVARI,TrainYield,...&#39;Method&#39;,&#39;regression&#39;,&#39;OOBPredictorImportance&#39;,&#39;on&#39;, &#39;MinLeafSize&#39;,nLeaf);
[RFPredictYield,RFPredictConfidenceInterval]&#61;predict(RFModel,TestVARI);
disp(&#39;预测结果&#xff1a;&#39;) ;
disp(RFPredictYield) ;%% 计算误差
RFRMSE&#61;sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));
RFrMatrix&#61;corrcoef(RFPredictYield,TestYield);
RFr&#61;RFrMatrix(1,2);
RFRMSEMatrix&#61;[RFRMSEMatrix,RFRMSE];
RFrAllMatrix&#61;[RFrAllMatrix,RFr];
if RFRMSE<1000disp(&#39;RFRMSE&#39;) ;disp(RFRMSE);
end%% 比较特征的重要性
figure
bar(RFModel.OOBPermutedVarDeltaError)
xlabel(&#39;Feature Number&#39;)
ylabel(&#39;Out-of-Bag Feature Importance&#39;)[mae,rmse,r2,mape] &#61; EvlMetrix(TestYield,RFPredictYield)
figure
plot(TestYield,&#39;b-d&#39;)
hold on
plot(RFPredictYield,&#39;r-d&#39;)
hold off
legend(&#39;GroundTruth&#39;,&#39;Prediction&#39;)
xlabel(&#39;Sample Number&#39;)
ylabel(&#39;target Value&#39;)

我就用了两个测试数据&#xff0c;效果不是特别明显。

 下面的是每个特征对分类的重要性&#xff0c;1>3>4>2&#xff0c;这个数据量越大&#xff0c;越准确&#xff0c;因为我的数据量很小&#xff0c;所有效果不是很明显。

三、Logistic模型


3.1、Logistic模型理论

我们看一下这个二分类问题&#xff0c;给了一些水果的属性数据和水果名称&#xff0c;根据水果水果属性&#xff0c;对水果名称进行预测。

首先需要创建虚拟变量&#xff0c;我们根据水果名称创建0和1的虚拟变量&#xff0c;用spss如下&#xff1a;

对于二分类问题&#xff0c;我们可以考虑使用logistic模型&#xff0c;预测的概率决定了分类类别&#xff0c;如下&#xff1a;

 一般就是使用极大似然估计进行参数估计&#xff0c;然后代入公式进行预测&#xff0c;如下&#xff1a;

 

3.2、SPSS求解逻辑回归

SPSS求解逻辑回归的过程如下&#xff0c;选中自变量和因变量&#xff0c;便可以完成回归预测。

 

预测的结果在如下表中&#xff0c;第一个是预测值&#xff0c;第二个是预测的分类值。

如果预测效果比较差&#xff0c;可以加入平方项作为自变量进行预测&#xff0c;一般会增加预测准确率&#xff0c;但是有可能造成过拟合&#xff0c;即训练效果好&#xff0c;测试效果差&#xff0c;泛化能力差&#xff0c;故可以划分训练集和测试集&#xff0c;多次交叉验证&#xff0c;得到一个稳定的结果。


推荐阅读
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 引号快捷键_首选项和设置——自定义快捷键
    3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
  • php7 curl_init(),php7.3curl_init获取301、302跳转后的数据
    最近在做一个蜘蛛项目,发现在抓取数据时,有时会碰到301的页面,原本写的curl_init函数php7-远程获取api接口或网页内容&#x ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 数学建模入门python绘制频率直方图
    文章目录例题数据处理绘图操作调用演示例题数据处理将以下的数据保存到磁盘上17275169551696417165167471716216867165521696216865 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
author-avatar
真心AI你fd_352
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有