Python数学建模与分析——Python数学模型选择

个人学习笔记,课程为Python数学建模与分析:基础入门、数据处理、算法编程、高级绘图、建模实战!

目录

一、评估算法

1.1简述

1.2评估算法方法

1.2.1简述

1.2.2评估算法方法

1.2.2.1分离训练数据集和评估数据集

(1)简述

(2)代码

1.2.2.2K折交叉验证分离

(1)简述

(2)代码

1.2.2.3弃一交叉验证分离

(1)简述

(2)代码

1.2.2.5重复随机评估、训练数据集分离。

(1)代码

二、算法评估矩阵

2.1简述

2.2方法

2.2.1分类算法矩阵

2.2.2分类准确度

(1)简述

(2)代码

2.2.3对数损失函数(Logloss)

(1)简述

(2)代码

2.2.4AUC图

(1)简述

(2)代码

​2.2.5混淆矩阵-Confusion Matrix

(1)简述

(2)代码

​2.2.6分类报告

(1)简述

(2)代码

2.2.7平均绝对误差(MAE)

2.2.8均方误差(MSE)

2.2.9决定系数(R^2)

三、分类算法

3.1线性算法

3.1.1逻辑回归

(1)简述

(2)代码

3.1.2线性判别分析

(1)简述

(2)代码

3.2非线性算法

3.2.1K近邻

3.2.2贝叶斯分类器

(1)简述

(2)代码

3.2.3分类与回归树

(1)简述

(2)代码

3.2.4支持向量机

(1)简述

(2)代码

四、回归算法

4.1线性回归

4.2岭回归

五、算法比较

5.1机器学习算法比较

5.2同一个数据集来比较六种分类方法


文中引入的csv文件:

链接:https://pan.baidu.com/s/1NWLzgAir70LQKUxv74lfIg?pwd=d2n5 
提取码:d2n5


一、评估算法

1.1简述

要知道算法模型对未知的数据表现如何,最好的评估办法是利用已经明确知道结果的数据运行生成的算法模型进行验证。此外,还可以采用重新采样评估的方法,使用新的数据来评估算法模型。本章就将介绍如何使用scikit--leam中的采样评估办法来评价算法模型的准确度。

1.2评估算法方法


1.2.1简述

在评估机器学习算法的时候,为什么不将训练数据集直接作为评估数据集,最直接的原因是过度拟合,不能有效地发现算法模型的不足。所谓拟合是指已知某函数的若干离散函数值{f,f…f},通过调整该函数中若干待定系数f{λ1,入2…入n},使该函数与己知点集的差别(最小二乘意义)最小。过度拟合是指为了得到一致假设变得过度严格。避免过度拟合是分类器设计中的一个核心任务,通常采用增大数据量和评估数据集的方法对分类器进行评估。想象一下,假设算法记住了所有的训练数据集,当采用相同的数据集来评价算法时,会得到一个很高的评分。但是,当预测新数据集时或许会表现很糟糕。因此,必须使用与训练集数据完全不同的评估数据集来评估算法。

1.2.2评估算法方法


评估就是估计算法在预测新数据的时候能达到什么程度,但这不是对算法准确度的保证。当评估完算法模型之后,可以用整个数据集(训练数据集和评估数据集的合集)重新训练算法,生成最终的算法模型。接下来将学习四种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型:


1.2.2.1分离训练数据集和评估数据集
(1)简述

最简单的方法就是将评估数据集和训练数据集完全分开,采用评估数据集来评估算法模
型。可以简单地将原始数据集分为两部分,第一部分用来训练算法生成模型,第二部分
通过模型来预测结果,并与己知的结果进行比较,来评估算法模型的准确度。如何分割
数据集取决于数据集的规模,通常会将67%的数据作为训练集,将33%的数据作为评估数
据集。这是一种非常简洁,快速的数据分离技术,通常在具有大量数据、数据分布比较
平衡,或者对问题的展示比较平均的情况下非常有效。这个方法非常快速,对某些执行
比较慢的算法非常有效。下面给出一个简单的按照67%:33%的比例分离数据,来评估逻
辑回归模型的例子。

(2)代码
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
test_size = 0.33
seed = 4
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed)

model = LogisticRegression()
model.fit(X_train,Y_train)
result = model.score(X_test,Y_test)
print('算法评估结果: %.3f %%' % (result * 100)  )
1.2.2.2K折交叉验证分离
(1)简述

交叉验证是用来验证分类器的性能的一种统计分析方法,有时也称作循环估计,在统计学上是将数据样本切割成小子集的实用方法。基本思想是按照某种规则将原始数据进行分组,部分作为训练数据集,另一部分作为评估数据集。首先用训练数据集对分类器进行训练,再利用评估数据集来测试训练得到的模型,以此作为评价分类器的性能指标。K折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,再用这K个模型最终的验证集的分类准确率的平均数作为此K折交叉验证下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取值,只有在原始数据集和数据量小的时候才会尝试取2。K折交叉验证可以有效地避免过学习及欠学习状态的发生,最后得到的结果也比较具有说服力。通常情况下,K的取值为3、5、10。

(2)代码
#K折交叉验证
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = LogisticRegression()
result = cross_val_score(model,X,Y,cv=kfold)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))
#K折交叉验证
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = LogisticRegression(multi_class='multinomial',max_iter=3000)
result = cross_val_score(model,X,Y,cv=kfold)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))


1.2.2.3弃一交叉验证分离
(1)简述

如果原始数据有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。相较于K折交叉验证弃一交叉验证有两个显著的优点:每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。但弃一交叉验证的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,弃一交叉验证在实际运行上便有困难,需要花费大量的时间来完成算法的运算与评估,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算减少计算所需的时间。

(2)代码
#弃一交叉验证分离
from pandas import read_csv
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
loocv = LeaveOneOut()
model = LogisticRegression(multi_class='multinomial',max_iter=3000)
result = cross_val_score(model,X,Y,cv=loocv)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))

1.2.2.5重复随机评估、训练数据集分离。
(1)代码
#重复随机分离
from pandas import read_csv
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
n_splits = 10
test_size = 0.33
seed = 7
kfold = ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed)
model = LogisticRegression(multi_class='multinomial',max_iter=3000)
result = cross_val_score(model,X,Y,cv=kfold)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))

二、算法评估矩阵

2.1简述

如何来评估机器学习的算法模型是非常重要的。选择能够展示机器学习算法模型的准确度的评估矩阵,是计算和此较算法模型最好的方式。并且在评估算法时,计算并比较这些评估矩阵,可以快速地选择合适的算法。使用scikit--learn来计算并展示算法的评估矩阵。

2.2方法

2.2.1分类算法矩阵

分类问题是最常见的数学建模和机器学习问题,并且有多种评估矩阵来评估分类算法


2.2.2分类准确度

(1)简述

分类准确度就是算法自动分类正确的样本数除以所有的样本数得出的结果。通常,准确度越高,分类器越好。这是分类算法中最常见,也最易被误用的评估参数。准确度确实是一个很好、很直观的评价指标,但是有时候准确度高并不代表算法就一定好。比如对某个地区某天地震的预测,假设有一堆的特征作为地震分类的属性,类别却只有两个(0:不发生地震,1:发生地震)。一个不加思考的分类器对每一个测试用例都将类别划分为0,那它就可能达到99%的准确度,但真的地震时,这个分类器却毫无察觉,这个分类器造成的损失是巨大的。为什么拥有99%的准确度的分类器却不是我们想要的,因为数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的准确度,却忽视了需要关注的事实和现象

(2)代码
from pandas import read_csv
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
n_splits = 10
test_size = 0.33
seed = 7
kfold = ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed)
model = LogisticRegression(multi_class='multinomial',max_iter=3000)
result = cross_val_score(model,X,Y,cv=kfold)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))


2.2.3对数损失函数(Logloss)

(1)简述

在逻辑回归的推导中,它假设样本服从伯努利分布(0~1分布),然后求得满足该分布的似然函数,再取对数、求极值等。而逻辑回归并没有求似然函数的极值,而是把极大化当作一种思想,进而推导出它的经验风险函数为:最小化负的似然函数[maxF(y,f)→min-F(y,f)]。从损失函数的视角来看,它就成了对数(Log)损失函数了。对数损失函数越小,模型就越好,而且使损失函数尽量是一个凸函数,便于收敛计算。

(2)代码
#对数损失函数
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_flods = 10
seed = 7
kflod = KFold(n_splits=num_flods, random_state=seed, shuffle=True)
model = LogisticRegression(multi_class='multinomial', max_iter=1100)
Scoring = 'neg_log_loss'
result = cross_val_score(model, X, Y, cv=kflod, scoring=Scoring)
print('LogLoss: %.3f (%.3f)' % (result.mean(),result.std()))


2.2.4AUC图

(1)简述

ROC和AUC是评价分类器的指标。ROC是受试者工作特征曲线(ReceiverOperatingCharacteristic Curve)的简写,又称为感受性曲线(Sensitivity Curve)。得此名的原因在于曲线上各点反映相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。ROC是反映敏感性和特异性连续变量的综合指标,用构法揭示敏感性和特异性的相互关系,通过将连续变量设定出多个不同的临界值计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线。AUC是ROC曲线下的面积(Area Under ROC Curve)的简称,顾名思义,AUC的值就是处于ROC Curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,AUC的值越大,诊断准确性越高。在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。

在ROC曲线上,靠近坐标图左上方的点为敏感性和特异性均较高的临界值。为了解释ROC的概念,让我们考虑一个二分类问题,即将实例分成正类(Positive)或负类(Negative)。对一个二分类问题来说,会出现四种情况:如果一个实例是正类并且也被预测成正类,即为真正类(True Positive):如果实例是负类却被预测成正类,称之为假正类(False Positive)。相应地,如果实例是负类也被预测成负类,称之为真负类(True Negative);如果实例为正类却被预测为负类,则为假负类(False Negative)。

准确率=(TP+TN)/(TP+TN+FP+FN)


虽然准确率可以判断总的正确率,但是在样本不平衡的情况下,并不能作为很好的指标来衡量结果。举个简单的例子,比如在一个总样本中,正样本占90%,负样本占10%,样本是严重不平衡的。对于这种情况,我们只需要将全部样本预测为正样本即可得到90%的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡准确率就会失效。

召回率(Reca)又叫敏感性(sensitivity),它是针对原样本而言的,它的含义是在实际为正的样本中
被预测为正样本的概率,其公式如下:召回率=TP/(TP+FN)召回率越高,就会有越少的正例被误判成负例,即查的全,代价就是可能会有越多的负例被误判成正例。

(2)代码
#AUC图
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_flods = 10
seed = 7
kflod = KFold(n_splits=num_flods, random_state=seed, shuffle=True)
model = LogisticRegression(multi_class='multinomial', max_iter=1100)
scoring = 'roc_auc'
result = cross_val_score(model,X,Y,cv=kflod,scoring=scoring)
print('AUC %.3f (%.3f)' % (result.mean(),result.std()))


2.2.5混淆矩阵-Confusion Matrix

(1)简述

混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目
每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。

(2)代码
#混淆矩阵
from pandas import read_csv
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
test_size = 0.33
seed = 4
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed)
model = LogisticRegression(multi_class='multinomial', max_iter=1100)
model.fit(X_train,Y_train)
predicted = model.predict(X_test)
matrix = confusion_matrix(Y_test,predicted)
classes = ['0','1']
dataframe = pd.DataFrame(data=matrix,index=classes,columns=classes)
print(dataframe)


2.2.6分类报告

(1)简述

精确率(precision):P=TP/(TP+FP)
召回率(recall):P=TP/(TP+FN)
F1值:同时兼顾了分类模型的准确率和召回率,F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0,值越大意味着模型越好。

(2)代码
#分类报告
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
test_size = 0.33
seed = 4
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed)
model = LogisticRegression(multi_class='multinomial', max_iter=1100)
model.fit(X_train,Y_train)
predicted = model.predict(X_test)
report = classification_report(Y_test,predicted)
print(report)

2.2.7平均绝对误差(MAE)

平均绝对误差是所有单个观测值与算术平均值的偏差的绝对值的平均值。与平均误差相比,平均绝对误差由于离差被绝对值化,不会出现正负相抵消的情况,因而,平均绝对误差能更好地反映预测值误差的实际情况。代码如下:

2.2.8均方误差(MSE)

均方误差是衡量平均误差的方法,可以评价数据的变化程度。均方根误差是均方误差的算术平方根。均方误差的值越小,说明用该预测模型描述实验数据的准确度越高。代码如下:

2.2.9决定系数(R^2)

决定系数(R2)
决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。拟合优度越大,自变量对因变量的解释程度越高,自变量引起的变动占总变动的百分比越高,观察点在回归直线附近越密集。如R2为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能控制白变量不变,则因变量的变异程度会减少80%。
决定系数(R2)的特点:
可决系数是非负的统计量。
可决系数的取值范围:0≤R2≤1
可决系数是样本观测值的函数,是因随机抽样而变动的随机变量。为此,对可决系数的统计的可靠性也应进行检验。代码如下:

三、分类算法

3.1线性算法

3.1.1逻辑回归

(1)简述

合出一个人的[身高,体重]这两个指标,然后逻辑回归是用来进行分类的。例如,我们判断这个人是属于”胖“还是”瘦“这一类。对于这个问题,我们可以先测量n个人的身高、体重以及对应的指标”胖“,"瘦”,把胖和瘦分别用0和1来表示,把这n组数据输入个人的身高、体重输入模型中,看这个人是属于模型进行训练。训练之后再把待分类的一“胖”还是“瘦”。示,可以用平面的点来表示数据,其中一个指标如果数据是有两个指为x轴,另一个为y轴;如果数据有三个指示,可以用空间中的点表示数据;如果是p维的话(p>3),就是p维空间中的点。从本质上来说,逻辑回归训练后的模型是平面的一条直线(p=2),或是平面(p=3),超平面(p>3)并且这条线或平面把空间中的散点分成两半,面的同一侧属于同一类的数据大多数分布在曲线或平面的同一侧。

(2)代码
from pandas import read_csv
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
n_splits = 10
test_size = 0.33
seed = 7
kfold = ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed)
model = LogisticRegression(multi_class='multinomial',max_iter=3000)
result = cross_val_score(model,X,Y,cv=kfold)
print('算法结果: %.3f %%(%.3f%%)' % (result.mean() * 100,result.std() * 100))

3.1.2线性判别分析

(1)简述

存在一个线性方程可以把待分类数据分开,或者说用一个超平面能将正负样本区分开

LDA的思想:“投影后类内方差最小,类间方差最大”。即数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。

(2)代码
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = LinearDiscriminantAnalysis()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

3.2非线性算法

3.2.1K近邻

(1)简述

K-近邻算法是最简单的分类器,没有显式的学习过程或训练过程,是懒惰学习(Lazy Learning)。当对数据的分布只有很少或者没有任何先验知识时,K近邻算法是一个不错的选择。
K近邻算法既能够用来解决分类问题,也能够用来解决回归问题。该方法有着非常简单的原理:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的个训练样本,根据这个样本的类别进行投票确定测试样本的类别。也可以通过个样本与测试样本的相似程度进行加权投票。如果需要以测试样本对应每类的概率的形式输出,可以通过个样本中不同类别的样本数量分布来进行估计。

(2)代码

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = KNeighborsClassifier()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

3.2.2贝叶斯分类器

(1)简述
(2)代码
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.naive_bayes import GaussianNB
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = GaussianNB()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

3.2.3分类与回归树

(1)简述

分类与回归树(CART)是应用广泛的算法,同样由特征选择、树的生成及剪枝组成,可以用于解决分类和回归问题。ID3算法、C4.5算法分别使用了信息增益、信息增益比来选择特征,他们都使用了包含大量的对数运算的熵模型来计算样本纯度。而CART算法使用基尼系数来代替信息增益(比),基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。CART决策树的生成过程是递归构建二叉树的过程对于分类树,使用基尼指数最小化准则:对回归树,使用平方误差最小化准则。

(2)代码
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = DecisionTreeClassifier()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

3.2.4支持向量机

(1)简述

支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面,可以将问题化为一个求解凸二次规划的问题。与逻辑回归和神经网络相比,支持向量机,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。具体来说就是在线性可分时,在原空间寻找两类样本的最优分类超平面。在线性不可分时,加入松弛变量并通过使用非线性映射将低维度输入空间的样本映射到高维度空间使其变为线性可分,这样就可以在该特征空间中寻找最优分类超平面。

(2)代码
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_fold = 10
seed = 7
kfold = KFold(n_splits=num_fold,random_state=seed,shuffle=True)
model = SVC()
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

四、回归算法

4.1线性回归

4.2岭回归

五、算法比较

5.1机器学习算法比较

5.2同一个数据集来比较六种分类方法

from pandas import read_csv
from sklearn.model_selection import ShuffleSplit
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from matplotlib import pyplot
from sklearn.model_selection import KFold
from  sklearn.model_selection import cross_val_score
filename = 'pima.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed =7
kfold = KFold(n_splits=num_folds,random_state=seed,shuffle=True)
models = {}
models['LR'] = LogisticRegression(multi_class='multinomial',max_iter=3000)
models['LDA'] = LinearDiscriminantAnalysis()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()
results = []
for name in models:
    result = cross_val_score(models[name],X,Y,cv=kfold)
    results.append(result)
    msg = '%s: %.3f(%.3F)' %(name,result.mean(),result.std())
    print(msg)

fig = pyplot.figure()
fig.suptitle('Algorithm Comparion')
ax =  fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值