python机器学习从零开始选择模型(代码片段)

靖墨c 靖墨c     2022-12-23     701

关键词:

目录

1.数据分离与验证

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

1.2K折交叉验证分离

1.3弃一交叉验证分离

1.4重复随机分离评估数据集与训练数据集

2.算法评估

2.1分类算法评估

2.2回归算法评估

总结


1.数据分离与验证

要知道算法模型对未知的数据表现如何,最好的评估办法是利用已经明确知道结果的数据运行生成的算法模型进行验证。此外还可以使用新的数据来评估算法模型。

在评估机器学习算法时,不将训练集直接作为评估数据集最直接的原因就是过度拟合。过度拟合是指为了得到一致性假设而变得过度严格,简单来说就是指模型仅对训练数据有较好的效果,而对于新数据则适应性很差

 如图所示是一个分类实例,绿色曲线表示过拟合,黑色曲线表示正常模型。可以看到过拟合模型仅对当前数据表现较好,而对新数据适应性明显不如正常模型。

 接下来将讲解四种不同的分离数据集的方法,用来分离训练集和评估集,并用其评估算法模型。

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

可以简单地将原始数据集分为两部分,第一部分用来训练算法生成模型,第二部分通过模型来预测结果,并于已知的结果进行比较,来评估算法模型的准确度。

from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import ShuffleSplit


filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# print(data.head(10))
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(max_iter=3000)
model.fit(X_train, Y_train)
result = model.score(X_test, Y_test)
print("算法评估结果:%3f%%" % (result * 100))

执行后得到的结果约为80%。为了让算法模型具有良好的可复用性,在指定了分离数据大小的同时,还指定了随机粒度(seed=4),将数据随即进行分离。通过指定随机的粒度,可以确保每次执行程序得到相同的结果,这有助于比较两个不同的算法生成模型的结果。

算法评估结果:80.314961%

1.2K折交叉验证分离

K折交叉验证是将原始数据分成K组(一般是均分),将第一部分作为测试集,其余作为训练集,训练模型,计算模型在测试集上的准确率,每次用不同部分作为测试集,重复上述步骤K次,最后将平均准确率作为最终的模型准确率。

# K折交叉验证分离
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed,shuffle=True)
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model, X, Y, cv=kfold)
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

执行后得到评估得分及标准方差。

算法评估结果:77.216% (4.968%)

1.3弃一交叉验证分离

相较于K折交叉验证分离,弃一交叉验证有显著优点:

  • 每一回合中几乎所有样本你皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
  • 实验过程中没有随机因素会影响实验数据,确保实验过程可重复。

但弃一交叉验证计算成本高,当原始数据样本数量多时,弃一交叉验证需要花费大量时间完成评估

# 弃一交叉验证分离
# 计算量非常大!!
loocv = LeaveOneOut()
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model,X,Y,cv = loocv)
print("算法评估结果:%.3f%% (%.3f%%)"% (result.mean()*100,result.std()*100))

运算得出的标准方差与K折交叉验证有较大差距。

算法评估结果:77.604% (41.689%)

1.4重复随机分离评估数据集与训练数据集

另外一种K折交叉验证的用途是随即分离数据为训练数据集和评估数据集。

n_splits = 10
test_size = 0.33
seed = 7
kfold = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=seed)
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model, X, Y, cv=kfold)
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))
算法评估结果:76.535% (2.235%)

2.算法评估

2.1分类算法评估

2.1.1分类准确度

分类准确度就是算法自动分类正确的样本数除以所有的样本数得出的结果。准确度是一个很好、很直观的评价指标,但是有时候准确度高并不代表算法就一定好。

from pandas import read_csv
import pandas as pd
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

#分类准确度
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename,names=names)
#print(data.head(10))
#将数据分为输入数据和输出结果
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)
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model, X,Y,cv=kfold)
print("算法评估结果准确度:%.3f(%.3f)" % (result.mean(),result.std()))
算法评估结果准确度:0.772(0.050)

2.1.2分类报告

在scikit-learn中提供了一个非常方便的工具,可以给出对分类问题的评估报告,Classification__report()方法能够给出precision,recall,F1-score,support。

from pandas import read_csv
import pandas as pd
from sklearn.model_selection import KFold
from sklearn.metrics import classification_report

#分类准确度
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename,names=names)
print(data.head(10))
#将数据分为输入数据和输出结果
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)
model = LogisticRegression(max_iter=3000)
model.fit(X_train,Y_train)
predicted = model.predict(X_test)
report = classification_report(Y_test, predicted)
print(report)
              precision    recall  f1-score   support

         0.0       0.84      0.87      0.86       171
         1.0       0.71      0.66      0.69        83

    accuracy                           0.80       254
   macro avg       0.78      0.77      0.77       254
weighted avg       0.80      0.80      0.80       254

2.2回归算法评估

回归算法评估将使用波士顿房价(Boston House Price)数据集。可通过百度网盘下载

链接:https://pan.baidu.com/s/15hcbjWIj5gC-nxRGzxWcOA 
提取码:1pvo

2.2.1平均绝对误差

平均绝对误差是所有单个观测值与算术平均值偏差绝对值的平均值。平均绝对误差相比于平均误差能更好地反映预测值误差的实际情况。

cross_val_score中的scoring参数详解可见官方开发文档

https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

filename = 'housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names,delim_whitespace=True)
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed,shuffle=True)
model = LinearRegression()

#平均绝对误差
scoring = 'neg_mean_absolute_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('MAE:%.3f(%.3f)'%  (result.mean(),result.std()))
MAE:-3.387(0.667)

2.2.2均方误差

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

#均方误差
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('MSE:%.3f(%.3f)'%  (result.mean(),result.std()))
MSE:-23.747(11.143)

2.2.3判定系数(

 判定系数(coefficient of determination),也叫可决系数或决定系数,是指在线性回归中,回归平方和与总离差平方和之比值,其数值等于相关系数的平方

#决定系数
scoring = 'r2'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('R2:%.3f(%.3f)'%  (result.mean(),result.std()))
R2:0.718(0.099)

总结

K折交叉验证是用来评估机器学习算法的黄金准则。黄金准则为:当不知如何选择分离数据集的方法时,选择K折交叉验证来分离数据集;当不知如何设定K值时,将K设为10。

从零开始搭建深度学习验证码识别模型(代码片段)

文章目录从零开始搭建深度学习验证码识别模型CNN模型与图像识别验证码数据集介绍生成数据集生成EasyCaptcha生成Kcaptcha搭建模型EasyNet模型KCapNet模型模型训练与参数选择优化方法与超参数数据集划分模型分析EasyNet算力计算KCap算... 查看详情

python机器学习及实践+从零开始通往kaggle竞赛之路

...习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读者熟悉并且掌握当下最流行的机器学习、数据挖掘与自然语言处理工具,如Scikitlearn... 查看详情

吴裕雄python机器学习——模型选择分类问题性能度量(代码片段)

importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.svmimportSVCfromsklearn.datasetsimportload_irisfromsklearn.preprocessingimportlabel_binarizefromsklearn.multiclassimportOneVsRestClassifierfromsk 查看详情

吴裕雄python机器学习——模型选择参数优化随机搜索寻优randomizedsearchcv模型(代码片段)

importscipyfromsklearn.datasetsimportload_digitsfromsklearn.metricsimportclassification_reportfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklea 查看详情

吴裕雄python机器学习——模型选择参数优化暴力搜索寻优gridsearchcv模型(代码片段)

importscipyfromsklearn.datasetsimportload_digitsfromsklearn.metricsimportclassification_reportfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklea 查看详情

吴裕雄python机器学习——模型选择损失函数模型(代码片段)

fromsklearn.metricsimportzero_one_loss,log_lossdeftest_zero_one_loss():y_true=[1,1,1,1,1,0,0,0,0,0]y_pred=[0,0,0,1,1,1,1,1,0,0]print("zero_one_loss<fraction>:",zero_one_loss(y_true,y_pred,normal 查看详情

吴裕雄python机器学习——模型选择回归问题性能度量(代码片段)

fromsklearn.metricsimportmean_absolute_error,mean_squared_error#模型选择回归问题性能度量mean_absolute_error模型deftest_mean_absolute_error():y_true=[1,1,1,1,1,2,2,2,0,0]y_pred=[0,0,0,1,1,1,0,0,0,0]print("MeanAbsolu 查看详情

用python+sklearn(机器学习)实现天气预报数据模型和使用(代码片段)

用python+sklearn机器学习实现天气预报模型和使用项目地址系列教程0.前言1.建立模型a.准备引入所需要的头文件选择模型选择评估方法获取数据集b.建立模型c.获取模型评估结果d.用joblib模块保存模型e.封装2.总控代码使用方法3.最... 查看详情

《机器学习及实践--从零开始通往kaggle竞赛之路》

...个把月的时间把这本书过了一遍。这是一本非常适合基于python入门的机器学习入门的书籍,全书通俗易懂且有代码提供。书中源代码连接为Ipython环境。主页君使用的是pycharm,python2.7,具体安转过程书本写的很详细。码完书中代... 查看详情

keras深度学习实战(15)——从零开始实现yolo目标检测(代码片段)

Keras深度学习实战(15)——从零开始实现YOLO目标检测0.前言1.YOLO目标检测模型1.1锚框(anchorboxes)1.2YOLO目标检测模型原理2.从零开始实现YOLO目标检测2.1加载数据集2.2计算锚框尺寸2.3创建训练数据集2.4实现YOLO目标检测模型2.5... 查看详情

联邦学习实战-1:用python从零开始实现横向联邦学习(代码片段)

什么是联邦学习?简单来说就是在一个多方的环境中,数据集是零散的(在各个不同的客户端中),那么怎样实现机器学习算法呢?首先想到的就是将多个数据集合并合并起来,然后统一的使用传统的... 查看详情

从零开始的神经网络构建历程(代码片段)

...构建神经网络历程系列的第一篇博文。本篇博文主要讲述Python中torch库在神经网络构建中的相关用法。torch库成员与神经网络中相关模块的对应关系由于逻辑回归以及其他机器学习算法解决不了非线性分类/回归问题,所以深... 查看详情

社区分享|从零开始学习tinyml(代码片段)

我们在上周的社区分享栏目中介绍了 社区分享|从零开始学习TinyML(一),本周我们将继续学习。 HelloWorld—梦开始的地方(中)在前面的准备工作中,我们完成了模型训练,并且将模型的二进制格式转化成为C&#... 查看详情

社区分享|从零开始学习tinyml(代码片段)

我们在上周的社区分享栏目中介绍了 社区分享|从零开始学习TinyML(一),本周我们将继续学习。 HelloWorld—梦开始的地方(中)在前面的准备工作中,我们完成了模型训练,并且将模型的二进制格式转化成为C&#... 查看详情

第一篇学习机器学习,从零开始准备

...所帮助。 学习原因:危机感学习准备:1.下载安装了python2.7,后来换成了python3.0,安装各种库累的半死然后下载anaconda一次性搞定,然后python入门,略2.下载安装了octave,然 查看详情

#夏日挑战赛#ffh从零开始的鸿蒙机器学习之旅-nlp情感分析(代码片段)

[本文正在参加星光计划3.0-夏日挑战赛]1.2导入StandfordCoreNLP库1.2.1我们可以在官网下载工具包StandfordCoreNLP1.2.2解压,并引入lib中右键文件夹,点击addaslibrary2.情感分析2.1新建JAVA类,NLP_EMOTIONpackagecom.example.nlpdemo.utils;importedu.stanford.nlp... 查看详情

从零开始搭建深度学习环境(代码片段)

...调参之路不能没有一个趁手的环境安装基础环境我使用的机器环境是:Ubuntu18.04安装显卡驱动1.2.按照cuda所需的版本安装3.sudoubuntu-driversautoinstall安装pipsudoapt-getinstallpython-pip下载anaconda3地址:https://www.anaconda.com/distribution/安... 查看详情

从零开始搭建深度学习环境(代码片段)

...调参之路不能没有一个趁手的环境安装基础环境我使用的机器环境是:Ubuntu18.04安装显卡驱动1.2.按照cuda所需的版本安装3.sudoubuntu-driversautoinstall安装pipsudoapt-getinstallpython-pip下载anaconda3地址:https://www.anaconda.com/distribution 查看详情