使用sklearn进行机器学习案例(1)

news/2024/7/9 8:39:26 标签: 机器学习, 笔记, sklearn

文章目录

    • 案例一. 加州房价预测
    • 案例二. MNIST手写数字识别
    • 案例三. 波士顿房价预测

案例一. 加州房价预测

线性回归通过对训练集进行训练,拟合出一个线性方程,使得预测值与实际值之间的平均误差最小化。这个过程可以使用梯度下降法等优化算法来实现。即通过最小化预测值(线性函数)与实际值之间的误差(成本函数)来训练出的模型。
sklearn中提供了可直接调用的线性回归算法模型LinearRegression()

案例一将加州房价数据集的80%用作训练集,其余20%用作测试集,通过给出的数据样本进行推理,得到一个函数模型后,就可以用于推断加州其他地区的房价(中位数)。

Python代码:

import pandas as pd #导入Pandas,用于数据读取和处理
# 读入房价数据,示例代码中的文件地址为internet链接,读者也可以下载该文件到本机进行读取
# 如,当数据集和代码文件位于相同本地目录,路径名应为"./house.csv",或直接放"house.csv"亦可
df_housing = pd.read_csv("https://raw.githubusercontent.com/huangjia2019/house/master/house.csv")
df_housing.head #显示加州房价数据的部分信息
X = df_housing.drop("median_house_value",axis = 1) #构建特征集X,去掉"median_house_value",其余赋给X
y = df_housing.median_house_value #构建标签集y,将df_housing.median_house_value单独赋给y

from sklearn.model_selection import train_test_split #导入数据集拆分工具
X_train, X_test, y_train, y_test = train_test_split(X, y,
         test_size=0.2, random_state=0) #以80%/20%的比例进行数据集的拆分

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练模型,拟合函数,确定参数

y_pred = model.predict(X_test) #预测测试集的y值
print('房价中位数的真值(测试集)', y_test)
print('预测的房价中位数(测试集)', y_pred)

print("给预测评分:", model.score(X_test, y_test)) #评估预测结果

import matplotlib.pyplot as plt #导入matplotlib画图库
#用散点图显示家庭收入中位数和房价中位数的分布
plt.scatter(X_test.median_income, y_test, color='brown', s=10)
#画出回归函数(从特征到预测标签)
plt.plot(X_test.median_income, y_pred, color='green', linewidth=0.1)
plt.xlabel('Median Income') #X轴-家庭收入中位数
plt.ylabel('Median House Value') #Y轴-房价中位数
plt.show() #显示房价分布和习得的函数图形

在这里插入图片描述
训练结果:

房价中位数的真值(测试集) 3873     171400.0
3625     189600.0
3028     500001.0
13814    229400.0
15398    163400.0
           ...   
1363     212500.0
7947     210500.0
14574    142900.0
10009    128300.0
9149      84700.0
Name: median_house_value, Length: 3400, dtype: float64
预测的房价中位数(测试集) [211157.06335416 218581.64298576 465317.31295563 ... 201751.23969632
 160873.51846958 138847.26913351]
给预测评分: 0.6321014171579509

案例二. MNIST手写数字识别

import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import mnist #从Keras中导入mnist数据集
#读入训练集和测试集
(X_train_image, y_train_lable), (X_test_image, y_test_lable) =  mnist.load_data()

print("特征集张量形状:", X_train_image.shape) #用shape方法显示张量的形状
print("第一个数据样本:\n", X_train_image[0]) #注意Python的索引是从0开始的
print("第一个数据样本的标签:", y_train_lable[0])

from tensorflow.keras.utils import to_categorical # 导入keras.utils工具箱的类别转换工具
X_train = X_train_image.reshape(60000,28,28,1) # 给标签增加一个维度
X_test = X_test_image.reshape(10000,28,28,1) # 给标签增加一个维度
y_train = to_categorical(y_train_lable, 10) # 特征转换为one-hot编码
y_test = to_categorical(y_test_lable, 10) # 特征转换为one-hot编码
print("数据集张量形状:", X_train.shape) # 特征集张量的形状
print("第一个数据标签:",y_train[0]) # 显示标签集的第一个数据

from keras import models # 导入Keras模型, 和各种神经网络的层
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
                 input_shape=(28,28,1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活,输出10维分类码
# 编译模型
model.compile(optimizer='rmsprop', # 指定优化器
              loss='categorical_crossentropy', # 指定损失函数
              metrics=['accuracy']) # 指定验证过程中的评估指标

model.fit(X_train, y_train, # 指定训练特征集和训练标签集
          validation_split = 0.3, # 部分训练集数据拆分成验证集
          epochs=5, # 训练轮次为5轮
          batch_size=128) # 以128为批量进行训练

score = model.evaluate(X_test, y_test) # 在测试集上进行模型评估
print('测试集预测准确率:', score[1]) # 打印测试集上的预测准确率

pred = model.predict(X_test[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0],"转换一下格式得到:",pred.argmax()) # 把one-hot码转换为数字
import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(X_test[0].reshape(28, 28),cmap='Greys') # 输出这个图片
plt.show() #显示图片

训练结果:

特征集张量形状: (60000, 28, 28)
第一个数据样本:
 [[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136
  175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253
  225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251
   93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119
   25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253
  150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252
  253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249
  253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253
  253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253
  250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201
   78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]]
第一个数据样本的标签: 5
数据集张量形状: (60000, 28, 28, 1)
第一个数据标签: [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
Epoch 1/5
329/329 [==============================] - 9s 27ms/step - loss: 1.0503 - accuracy: 0.8201 - val_loss: 0.1492 - val_accuracy: 0.9578
Epoch 2/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1949 - accuracy: 0.9464 - val_loss: 0.0734 - val_accuracy: 0.9794
Epoch 3/5
329/329 [==============================] - 11s 35ms/step - loss: 0.1417 - accuracy: 0.9618 - val_loss: 0.0663 - val_accuracy: 0.9834
Epoch 4/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1132 - accuracy: 0.9697 - val_loss: 0.0683 - val_accuracy: 0.9818
Epoch 5/5
329/329 [==============================] - 11s 34ms/step - loss: 0.0917 - accuracy: 0.9745 - val_loss: 0.0669 - val_accuracy: 0.9817
313/313 [==============================] - 1s 3ms/step - loss: 0.0638 - accuracy: 0.9826
测试集预测准确率: 0.9825999736785889
1/1 [==============================] - 0s 41ms/step
[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15
 9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09] 转换一下格式得到: 7

在这里插入图片描述
其中onehot编码[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]显示为[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15 9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09] 是因为默认采用了科学计数法形式显示,当数值非常小时会用浮点数精确表示。要想取消这样表示可通过:np.set_printoptions(suppress=True) # 取消科学计数法的形式显示 来设置。

案例三. 波士顿房价预测

更换案例一的数据集为波士顿房价,数据集存在于keras及很多其它框架内部,可以通过下述语句导入
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集,使用案例一的线性回归模型对波士顿房价数据训练集进行房价中位数的预测。

由于keras中调用了tensorflow(相当于精简版的tf),所以要先pip install tensorflow

Boston Housing
该数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。
数据集都有以下14个属性:
0-CRIM–城镇人均犯罪率 ------【城镇人均犯罪率】
1-ZN - 占地面积超过25,000平方英尺的住宅用地比例。 ------【住宅用地所占比例】
2-INDUS - 每个城镇非零售业务的比例。 ------【城镇中非商业用地占比例】
3-CHAS - Charles River虚拟变量(如果是河道,则为1;否则为0 ------【查尔斯河虚拟变量,用于回归分析】
4-NOX - 一氧化氮浓度(每千万份) ------【环保指标】
5-RM - 每间住宅的平均房间数 ------【每栋住宅房间数】
6-AGE - 1940年以前建造的自住单位比例 ------【1940年以前建造的自住单位比例 】
7-DIS -波士顿的五个就业中心加权距离 ------【与波士顿的五个就业中心加权距离】
8-RAD - 径向高速路的可达性指数 ------【距离高速公路的便利指数】
9-TAX - 每10,000美元的全额物业税率 ------【每一万美元的不动产税率】
10-PTRATIO - 城镇的学生与教师比例 ------【城镇中教师学生比例】
11-B - 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 ------【城镇中黑人比例】
12-LSTAT - 人口状况下降% ------【房东属于低等收入阶层比例】
13-MEDV - 自有住房的中位数报价, 单位1000美元 ------【自住房屋房价中位数】

同样是将0-12赋值给X_train作为训练集中的特征集,13给y_train作为标签集

import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集
#读入训练集和测试集
(X_train, y_train), (X_test, y_test) = boston_housing.load_data()

print ("数据集张量形状:", X_train.shape) #shape方法显示张量的形状
print ("第一个数据样本:\n", X_train[0]) #注意Python的索引是从0开始的
print ("第一个数据样本的标签:", y_train[0])

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练机器,拟合函数,确定参数

y_pred = model.predict(X_test) #预测测试集的Yprint ('房价的真值(测试集)',y_test)
print ('预测的房价(测试集)',y_pred)

print("给预测评分:", model.score(X_test, y_test)) #评估预测结果

训练结果:

数据集张量形状: (404, 13)
第一个数据样本:
 [  1.23247   0.        8.14      0.        0.538     6.142    91.7
   3.9769    4.      307.       21.      396.9      18.72   ]
第一个数据样本的标签: 15.2
房价的真值(测试集) [ 7.2 18.8 19.  27.  22.2 24.5 31.2 22.9 20.5 23.2 18.6 14.5 17.8 50.
 20.8 24.3 24.2 19.8 19.1 22.7 12.  10.2 20.  18.5 20.9 23.  27.5 30.1
  9.5 22.  21.2 14.1 33.1 23.4 20.1  7.4 15.4 23.8 20.1 24.5 33.  28.4
 14.1 46.7 32.5 29.6 28.4 19.8 20.2 25.  35.4 20.3  9.7 14.5 34.9 26.6
  7.2 50.  32.4 21.6 29.8 13.1 27.5 21.2 23.1 21.9 13.  23.2  8.1  5.6
 21.7 29.6 19.6  7.  26.4 18.9 20.9 28.1 35.4 10.2 24.3 43.1 17.6 15.4
 16.2 27.1 21.4 21.5 22.4 25.  16.6 18.6 22.  42.8 35.1 21.5 36.  21.9
 24.1 50.  26.7 25. ]
预测的房价(测试集) [ 9.69267239 21.05859431 20.94145461 34.25223414 25.95902598 20.56741038
 28.15310405 25.07113862 20.30519458 22.82489511 20.29027213 18.07938917
 16.46141024 35.31166595 19.41369959 19.34727116 24.58140904 21.01346252
 19.99079236 23.79286427 12.20780045 17.14218992 22.51468752 12.92570511
 21.18070615 23.94073547 33.46176314 24.2631555  13.35213096 20.71939252
 23.45082103 19.1486881  36.09743765 23.47113531 19.03141995  5.92425733
 14.02090469 22.96425377 16.01731242 27.09134249 22.06997029 28.61755389
 17.75679772 34.75579014 31.29455712 24.73234165 31.12655323 18.09268992
 22.62638989 24.21208909 30.5854317  18.71860574 10.50163617 13.73779292
 34.4022841  27.53140317 18.08151522 40.05101982 37.63271513 24.64021422
 25.73823434 20.64369987 20.33514699 21.38393124 24.63485497 23.53071805
 17.42141466 26.76911736  3.83782148 11.97063636 24.2602519  23.67191799
 23.66639182  8.4403269  28.52690962 20.94071229 20.44489658 24.77678169
 33.77299778  7.02038331 24.55379254 36.73923493 16.09878612 18.14663987
 20.48899554 18.7928142  22.45683561 26.19154506 23.36585592 28.89583791
 17.48243942 16.05642916 26.69532678 28.1393996  35.04164989 20.05308052
 36.25269116 38.51475052 25.13506119 41.49062194 34.65500235 25.33950895]
给预测评分: 0.7213535934621558

参考文献:
[1] 黄佳——《零基础学机器学习


http://www.niftyadmin.cn/n/368351.html

相关文章

docker版jxTMS使用指南:python服务之jxLocalStateMachine

本文讲解4.0版jxTMS中python服务的jxLocalStateMachine模块,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容 docker版本的使用,请参考:docker版jxTMS使用指南 jxLocalStateMachine提供了一个简单可靠的有…

认识http协议---3

hi,大家好,今天为大家带来http协议的相关知识 🍇1.http状态响应码 🍇2.构造http请求 1.直接在地址栏里输入一个URL 2.html的一些特殊标签,触发get请求 3.提交form表单,可以触发get请求和post请求 4.使用ajax 🍇3.再次谈同步和异步 &#x1f3…

跨域问题及解决方案

跨域问题是指在前端Web开发中,不同源的网页之间无法相互访问或通信的问题。产生跨域问题的原因是由于浏览器的同源策略(Same Origin Policy)所导致的。 同源策略是浏览器的一种安全机制,限制了来自不同源(域名、端口、…

【程序人生】上海城市开发者社区小聚有感

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

GPT怎样教我用Python进行数据可视化

文章目录 GPT怎样教我用Python进行数据可视化matplotlibpyecharts总结 GPT怎样教我用Python进行数据可视化 🚀🚀首先,我们先看一下这段代码,这是我之前写来读取excel文件中xx大学在各个类别中的获奖情况,并保存在一个…

真相只有一个——真正排名

这里写目录标题 1.题目描述2.解题思路3.代码展 所属专栏:脑筋急转弯❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ 🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持…

【原创】浅谈EtherCAT主站EOE(上)-EOE网络

版权声明:本文为本文为博主原创文章,未经同意,禁止转载。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/ 文章目录 一、EoE二、EoE服务规范EtherCAT主站如何提供EoE服务? 三、EoE网络EOE网…

子网划分、计算网络地址问题

文章目录 前言概念子网划分计算网络地址 前言 本篇博客从概念入手,层层递进,详细分析了如何应对子网划分问题以及计算网络地址两大问题。 概念 简单介绍一下 网络号、主机号、子网号、网络地址、子网掩码 的概念。 ① 网络号(网络前缀&am…