机器学习技术(三)——机器学习实践案例总体流程

news2024/11/27 0:42:28

机器学习实践案例总体流程

文章目录

  • 机器学习实践案例总体流程
    • 一、引言
    • 二、案例
      • 1、决策树对鸢尾花分类
        • 1.数据来源
        • 2.数据导入及描述
        • 3.数据划分与特征处理
        • 4.建模预测
      • 2、各类回归波士顿房价预测
        • 1.案例数据
        • 2.导入所需的包和数据集
        • 3.载入数据集,查看数据属性,可视化
      • 3、分割数据集,并对数据集进行预处理
      • 4、利用各类回归模型,对数据集进行建模
      • 5、利用网格搜索对超参数进行调节

在这里插入图片描述

一、引言

前面学习了一些基础知识,但还没有步入机器学习算法。通过两个案例,来掌握机器学习模型的训练与评估、机器学习模型搭建的总体流程以及特征处理、决策树模型、交叉检验、网格搜索等常用数据挖掘方法的知识。

二、案例

1、决策树对鸢尾花分类

1.数据来源

本道题目使用数据集为“iris.data”。这份数据集包含3种不同类型的鸢尾花 (Setosa, Versicolour, and Virginica) 的数据,数据形状为150x5, 五列字段分别为sepal_length(萼片长度)、sepal_width(萼片宽度)、petal_length(花瓣长度)、petal_width(花瓣宽度)、类别。

2.数据导入及描述

导入数组处理numpy、数据分析pandas模块、可视化模块matplotlib。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

导入数据集文件 “iris.data”,命名为iris_data,将5列数据列名设置为’sepal_length_cm’, ‘sepal_width_cm’, ‘petal_length_cm’, ‘petal_width_cm’, ‘class’。

iris_data = pd.read_csv('./iris.data')
iris_data.columns = ['sepal_length_cm', 'sepal_width_cm', 'petal_length_cm', 'petal_width_cm', 'class']

查看(除表头外)前 5 行数据,查看数据描述信息。

iris_data.head()
iris_data.describe()

输出:

sepal_length_cmsepal_width_cmpetal_length_cmpetal_width_cm
count150.000000150.000000150.000000150.000000
mean5.8433333.0573333.7580001.199333
std0.8280660.4358661.7652980.762238
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000

3.数据划分与特征处理

将数据集切分为4列特征和类别,导入sklearn库中的train_test_split方法将数据集的75%作为训练集和25%作为测试集。

from sklearn.model_selection import train_test_split
all_inputs = iris_data[['sepal_length_cm', 'sepal_width_cm', 'petal_length_cm', 'petal_width_cm']].values
all_classes = iris_data['class'].values
(training_inputs,testing_inputs,training_classes,testing_classes) = train_test_split(all_inputs, all_classes, train_size=0.75, random_state=1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wCJdleQM-1688539473388)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230703151156315.png)]

4.建模预测

导入sklearn中的DecisionTreeClassifier,构建决策树模型进行分类模型训练,并在测试集上进行评分。

from sklearn.tree import DecisionTreeClassifier
decision_tree_classifier = DecisionTreeClassifier()
decision_tree_classifier.fit(training_inputs, training_classes)
decision_tree_classifier.score(testing_inputs, testing_classes)

输出:

0.9736842105263158

导入sklearn中的cross_val_score,构建决策树模型,进行10次交叉验证,并输出评分。

from sklearn.model_selection import cross_val_score
decision_tree_classifier = DecisionTreeClassifier()
cv_scores = cross_val_score(decision_tree_classifier, all_inputs, all_classes, cv=10)
print (cv_scores)

输出:

[1.         0.93333333 1.         0.93333333 0.93333333 0.86666667
 0.93333333 1.         1.         1.        ]

构建决策树模型,设置max_depth=1,进行10次交叉验证,并输出评分。

decision_tree_classifier = DecisionTreeClassifier(max_depth=1)
cv_scores = cross_val_score(decision_tree_classifier, all_inputs, all_classes, cv=10)
print (cv_scores)

输出:

[0.66666667 0.66666667 0.66666667 0.66666667 0.66666667 0.66666667
 0.66666667 0.66666667 0.66666667 0.66666667]

导入sklearn中的GridSearchCVStratifiedKFold,构建决策树模型,对决策树模型参数进行网格搜索,设置parameter_grid = {'max_depth': [1, 2, 3, 4, 5],'max_features': [1, 2, 3, 4]},进行10次交叉验证,输出最优模型评分和最佳参数。

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
decision_tree_classifier = DecisionTreeClassifier()
parameter_grid = {'max_depth': [1, 2, 3, 4, 5],
                 'max_features': [1, 2, 3, 4]}
cross_validation = StratifiedKFold(n_splits=10)
grid_search = GridSearchCV(decision_tree_classifier, param_grid=parameter_grid, cv=cross_validation)
grid_search.fit(all_inputs, all_classes)

print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))

输出:

Best score: 0.96
Best parameters: {'max_depth': 3, 'max_features': 4}

在这里插入图片描述

2、各类回归波士顿房价预测

由于本案例使用的数据集样本量较小,且数据来自于scikit-learn自带的开源波士顿房价数据。波士顿房价预测项目是一个简单的回归模型,通过此案例可以学会一些关于机器学习库sklearn的基本用法和一些基本的数据处理方法。

1.案例数据

该案例主要内容是进行波士顿数据集,共有13个特征,总共506条数据,每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。具体如下:

CRIM:城镇人均犯罪率。
ZN:住宅用地超过 25000 sq.ft.的比例。
INDUS:城镇非零售商用土地的比例。
CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
NOX:一氧化氮浓度。
RM:住宅平均房间数。
AGE:1940 年之前建成的自用房屋比例。
DIS:到波士顿五个中心区域的加权距离。
RAD:辐射性公路的接近指数。
TAX:每 10000 美元的全值财产税率。
PTRATIO:城镇师生比例。
B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
LSTAT:人口中地位低下者的比例。
target:自住房的平均房价,以千美元计。

2.导入所需的包和数据集

保证下方引入的内容已经被安装。

pip install xgboost

# 防止不必要的警告
import warnings
warnings.filterwarnings("ignore")

# 引入数据科学基础包
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import scipy.stats as st
import seaborn as sns

# 引入机器学习,预处理,模型选择,评估指标
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import r2_score

# 引入本次所使用的波士顿数据集
from sklearn.datasets import load_boston

# 引入算法
from sklearn.linear_model import RidgeCV, LassoCV, LinearRegression, ElasticNet
#对比SVC,是svm的回归形式
from sklearn.svm import SVR
# 集成算法
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from xgboost import XGBRegressor

3.载入数据集,查看数据属性,可视化

  1. 载入波士顿房价数据集,获取特征和标签,查看相关属性
# 载入波士顿房价数据集
boston = load_boston()

# x是特征,y是标签
x = boston.data
y = boston.target

# 查看相关属性
print('特征的列名')
print(boston.feature_names)
print("样本数据量:%d, 特征个数:%d" % x.shape)
print("target样本数据量:%d" % y.shape[0])

输出:

特征的列名
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
样本数据量:506, 特征个数:13
target样本数据量:506
  1. 数据转化为dataframe形式
x = pd.DataFrame(boston.data, columns=boston.feature_names)
x.head()

输出:

CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.98
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.14
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.03
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.94
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.33
  1. 对标签的分布进行可视化
sns.distplot(tuple(y), kde=False, fit=st.norm)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g5fr0emz-1688539473390)(D:\Administrator\Downloads\Untitled.png)]

3、分割数据集,并对数据集进行预处理

将数据分割为训练集和测试,将数据集进行标准化处理

# 数据分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=28)

# 标准化数据集
ss = StandardScaler()
x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)
x_train[0:100]

输出:

array([[-0.35703125, -0.49503678, -0.15692398, ..., -0.01188637,
         0.42050162, -0.29153411],
       [-0.39135992, -0.49503678, -0.02431196, ...,  0.35398749,
         0.37314392, -0.97290358],
       [ 0.5001037 , -0.49503678,  1.03804143, ...,  0.81132983,
         0.4391143 ,  1.18523567],
       ...,
       [-0.34697089, -0.49503678, -0.15692398, ..., -0.01188637,
         0.4391143 , -1.11086682],
       [-0.39762221,  2.80452783, -0.87827504, ...,  0.35398749,
         0.4391143 , -1.28120919],
       [-0.38331362,  0.41234349, -0.74566303, ...,  0.30825326,
         0.19472652, -0.40978832]])

4、利用各类回归模型,对数据集进行建模

  1. 输入模型名字
# 模型的名字
names = ['LinerRegression',
       'Ridge',
       'Lasso',
       'Random Forrest',
       'GBDT',
       'Support Vector Regression',
       'ElasticNet',
       'XgBoost']
  1. 创建模型列表
# 定义模型
# cv在这里是交叉验证的思想
models = [LinearRegression(),
         RidgeCV(alphas=(0.001,0.1,1),cv=3),
         LassoCV(alphas=(0.001,0.1,1),cv=5),
         RandomForestRegressor(n_estimators=10),
         GradientBoostingRegressor(n_estimators=30),
         SVR(),
         ElasticNet(alpha=0.001,max_iter=10000),
         XGBRegressor()]
  1. 输出所有回归模型的R2评分
# 先定义R2评分的函数
def R2(model,x_train, x_test, y_train, y_test):
    model_fitted = model.fit(x_train,y_train)
    y_pred = model_fitted.predict(x_test)
    score = r2_score(y_test, y_pred)
    return score
  1. 遍历所有模型进行评分
# 遍历所有模型进行评分
for name,model in zip(names,models):
    score = R2(model,x_train, x_test, y_train, y_test)
    print("{}: {:.6f}, {:.4f}".format(name,score.mean(),score.std()))

输出:

LinerRegression: 0.564115, 0.0000
Ridge: 0.563673, 0.0000
Lasso: 0.564049, 0.0000
Random Forrest: 0.735384, 0.0000
GBDT: 0.730172, 0.0000
Support Vector Regression: 0.517260, 0.0000
ElasticNet: 0.563992, 0.0000
XgBoost: 0.759977, 0.0000

5、利用网格搜索对超参数进行调节

  1. 使用网格搜索,以及交叉验证
# 模型构建
'''
  'kernel': 核函数
  'C': SVR的正则化因子,
  'gamma': 'rbf', 'poly' and 'sigmoid'核函数的系数,影响模型性能
'''

parameters = {
   'kernel': ['linear', 'rbf'],
   'C': [0.1, 0.5,0.9,1,5],
   'gamma': [0.001,0.01,0.1,1]
}

# 使用网格搜索,以及交叉验证
model = GridSearchCV(SVR(), param_grid=parameters, cv=3)
model.fit(x_train, y_train)

输出:

GridSearchCV(cv=3, estimator=SVR(),
             param_grid={'C': [0.1, 0.5, 0.9, 1, 5],
                         'gamma': [0.001, 0.01, 0.1, 1],
                         'kernel': ['linear', 'rbf']})
  1. 获取最优参数
# 获取最优参数
print ("最优参数列表:", model.best_params_)
print ("最优模型:", model.best_estimator_)
print ("最优R2值:", model.best_score_)

输出:

最优参数列表: {'C': 5, 'gamma': 0.1, 'kernel': 'rbf'}
最优模型: SVR(C=5, gamma=0.1)
最优R2值: 0.7965173649188232
  1. 可视化
ln_x_test = range(len(x_test))
y_predict = model.predict(x_test)

# 设置画布
plt.figure(figsize=(16,8), facecolor='w')
# 用红实线画图
plt.plot(ln_x_test, y_test, 'r-', lw=2, label=u'真实值')
# 用绿实线画图
plt.plot(ln_x_test, y_predict, 'g-', lw = 3, label=u'SVR算法估计值,$R^2$=%.3f' % (model.best_score_))

# 图形显示
plt.legend(loc = 'upper left')
plt.grid(True)
plt.title(u"波士顿房屋价格预测(SVM)")
plt.xlim(0, 101)
plt.show()

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9kGygQf-1688539473390)(D:\Administrator\Downloads\service-course_7672b82e_273.PNG)]

如汉字不能正常显示,请设置为英文或将字体文件放到指定路径中,在使用时调用字体文件。

如不能解决请参考:https://blog.csdn.net/hfy1237/article/details/128218567

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划算法练习】day15

文章目录 一、01背包1.题目简介2.解题思路3.代码4.运行结果 二、416. 分割等和子集1.题目简介2.解题思路3.代码4.运行结果 三、494. 目标和1.题目简介2.解题思路3.代码4.运行结果 四、1049. 最后一块石头的重量 II1.题目简介2.解题思路3.代码4.运行结果 总结 一、01背包 1.题目…

【设计模式】第十三章:模板方法模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章&…

20.BeautifulSoup库的安装及导入

文章目录 1.BeautifulSoup库简介2.BeautifulSoup库的安装3.BeautifulSoup和beautifulsoup4的区别4.获取网页源代码知识回顾4.1 手动获取网页的源代码4.2 requests库获取网页的源代码 5. 利用bs4库输出网页源代码6.bs4库的导入语法 1.BeautifulSoup库简介 BeautifulSoup库是Pyt…

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行…

NGINX+Tomcat负载均衡、动静分离集群

目录 前言 一、NGINX正向代理与反向代理 1.1、NGINX正向代理 1.2、NGINX反向代理 1. 2.1Nginx配置反向代理的主要参数 二、负载均衡 三、NGINX动静分离集群 3.1动静分离原理 四、NginxTomcat动静分离 4.1搭建nginx代理服务器192.168.14.100 4.1.1安装 NGINX依赖环境 …

创建UI组件库后上传NPM

上篇已经讲了如何创建自己的组件库,这篇讲怎么上传npm后,可以下载使用 1.首先看下组件的文件结构 在index.js中要写上每个组件可以按需引用的条件 import Button from "./src/button";Button.install function(Vue) {Vue.component(Button.…

Tkinter_使用Progressbar创建和管理进度条

前言 Progressbar是Tkinter库中的一个小部件,用于创建和管理进度条。它可以在图形用户界面中显示任务的进度,并提供了多种样式和配置选项。 使用Progressbar,你可以按照固定或不确定的进度展示任务的进行状态。它可以显示任务完成的百分比&am…

“this“ 隐式具有类型 “any“,因为它没有类型注释。

在 tsconfig.json文件中 将 "noImplicitThis" 改为false "noImplicitThis": false,

工业互联网如何促进传统制造业的高效生产?

工业互联网,也称为工业物联网(IIoT),是指将联网设备和系统集成到传统制造流程中。它结合了传感器、数据分析、机器学习和自动化,以优化和提高制造各个方面的效率。工业互联网促进传统制造业高效生产的方式有&#xff1…

机器学习、监督学习、无监督学习基本概念

- 机器学习 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习有…

Nginx反向代理提示413 Request Entity Too Large

请求返回的内容如下 <html> <head><title>413 Request Entity Too Large</title></head> <body> <center><h1>413 Request Entity Too Large</h1></center> <hr><center>nginx/1.20.2</center>…

BPM工作流引擎优势

什么是BPM工作流引擎&#xff1f; BPM工作流引擎是对企业的业务进行的管理&#xff0c;是一个开放性的平台。它是BPM与工作流引擎的结合。不仅能够实现所有OA的功能&#xff0c;还能够实现以端到端为中心的协作&#xff0c;重视企业从战略到执行自上而下的流程化、规范化管理&a…

用OpenCV创建一张类型为CV_8UC1的单通道随机灰度图像

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>int

差分进化算法(Differential Evolution,DE,附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、差分进化算法&a…

7、Maxwell安装部署

1、Maxwell简介 1.1 Maxwell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等…

java项目之KTV点歌系统源码(ssm+jsp+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的KTV点歌系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&#xff0…

FPGA实验六:PWM信号调制器设计

目录 一、实验目的 二、设计要求 三、实验代码 1.顶层文件代码 2.仿真文件部分代码 3.系统工程文件 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 一、实验目的 &#xff08;1&#xff09;掌握通信信号调制过程及实现原理…

Linux调优–I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程&#xff0c;有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列&#xff1a;确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备&#xff0c;以此来减少磁盘寻道时间&#xff0c;从而提高系…

Android TEE可信计算环境与TrustZone基础

文章目录 前言可信计算环境TEE嵌入式安全现状现有的TEE分类TEE的应用场景TEE存在必要性 TrustZone移动端数据隔离安全/非安全世界CPU的特权等级TrustZone的结构CA与TA通信流程 TEE安全设计系统总线设计内存隔离机制安全启动机制安全通信机制 总结 前言 先引用 《可信计算&…

Java中规模软件开发实训——简单计算器制作

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;在现代社会中…