小白学数据:教你用Python实现简单监督学习算法

简介:

监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近日,监督学习也依旧是入门机器学习的钥匙。

这篇监督学习教程适用于刚入门机器学习的小白。

当然了,如果你已经熟练掌握监督学习,也不妨快速浏览这篇教程,检验一下自己的理解程度~

什么是监督学习?

在监督学习中,我们首先导入包含有训练属性和目标属性的数据集。监督学习算法会从数据集中学习得出训练样本和其目标变量之间的关系,然后将学习到的关系对新样本(未被标记的样本)进行分类。

为了阐明监督学习的工作原理,我们用根据学生学习时间预测其考试成绩的例子来说明。

用数学表示,即Y = f(X)+ C,其中

  • f表示学生学习时间和考试成绩之间的关系
  • X表示输入(学习小时数)
  • Y表示输出(考试分数)
  • C表示随机误差

监督学习算法的终极目标是给出新的输入X,使得预测结果Y的准确率最大。有很多方法可以实现有监督学习,我们将探讨几种最常用的方法。

根据给定的数据集,机器学习可以分为两大类:分类(Classification)和回归(Regression)。如果给定的数据集的输出值是类别,那么待解决是分类问题。如果给定的数据集的输出值是连续的,那么该问题是回归问题。

举两个例子

分类:判断是猫还是狗。

回归:房子的售价是多少?

分类

考虑这样一个例子,医学研究员想要分析乳腺癌数据,用于预测患者使用三种治疗方案中的哪一种。该数据分析问题就属于分类问题,通过建立分类模型来预测类别标签,例如治疗方案A治疗方案B或者治疗方案C

分类是一个预测类别标签的预测问题,这些类别标签都是离散和无序的。分类包含两个步骤:学习步骤和分类步骤。

分类方法和选择最优方法

一些常见的分类算法:

  • K近邻
  • 决策树
  • 朴素贝叶斯
  • 支持向量机

在学习步骤中,分类模型通过分析训练集数据建立一个分类器。在分类步骤中,分类器对给定的数据进行分类。用于分析的数据集(包含数据和其对应的标签)被划分为训练集和测试集。训练集从分析用的数据集中随机抽取。剩下的数据集构成测试集。测试集和训练集相互独立,即测试集中的数据不会被构建于分类器。

测试集用于评价分类器的预测精度。分类器的精度用测试集中预测正确的百分比表示。为了获得更高的精度,最好的方法是测试多个不同的算法,同时,对每个算法尝试不同的参数。可以通过交互检验选择最好的算法和参数。

对于给定问题,在选取算法时,算法的精度、训练时间、线性、参数数目以及特殊情况都要考虑在内。

在IRIS数据集上实现sklearn中的KNN,并对给定的输入进行花卉类型分类。

首先,要应用机器学习算法,我们需要了解给定数据集的组成。在这个例子中,我们使用内置在sklearn包中的IRIS数据集。现在让我们使用代码查看IRIS数据集。

请确保你的电脑上成功安装了Python。然后,通过PIP安装下面这些python库:

pip install pandas
pip install matplotlib
pip install scikit-learn
AI 代码解读

在下面这段代码中,我们使用pandas中的一些方法查看IRIS数据集的一些属性。

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt

# Loading IRIS dataset from scikit-learn object into iris variable.
iris = datasets.load_iris()

# Prints the type/type object of iris
print(type(iris))
# <class 'sklearn.datasets.base.Bunch'>

# prints the dictionary keys of iris data
print(iris.keys())

# prints the type/type object of given attributes
print(type(iris.data), type(iris.target))

# prints the no of rows and columns in the dataset
print(iris.data.shape)

# prints the target set of the data
print(iris.target_names)

# Load iris training dataset
X = iris.data

# Load iris target set
Y = iris.target

# Convert datasets' type into dataframe
df = pd.DataFrame(X, columns=iris.feature_names)

# Print the first five tuples of dataframe.
print(df.head())
AI 代码解读

输出:

<classsklearn.datasets.base.Bunch’>
dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])]
<classnumpy.ndarray’> <classnumpy.ndarray’>
(150, 4)
[‘setosa’ ‘versicolor’ ‘virginica’]
sepal length (cm) sepal width (cm) petal length (cm) petal width  (cm)
0   5.1   3.5   1.4  0.2
1   4.9   3.0   1.4  0.2
2   4.7   3.2   1.3  0.2
3   4.6   3.1   1.5  0.2
4   5.0   3.6   1.4  0.2
AI 代码解读

Sklearn中的K最近邻算法

如果一个算法仅存储训练集数据,并等待测试集数据的给出,那么这个算法便可认为是一个“懒惰学习法”。直到给定测试集数据,它才会根据它与存储的训练集样本的相似性来对新样本进行分类。

K近邻分类器就是一个懒惰学习法。

K近邻基于类比学习,比较一个测试样本和与之相似训练集数据。训练集有n个属性表征。每个样本由n维空间中的一个点表示。这样,训练集中的所有样本都储存在n维模式空间中。当给定一个未知的样本,K近邻分类器在模式空间中搜寻和未知样本最接近的k个训练样本。这k个训练样本就是未知样本的k个近邻。

“接近度”用距离来度量,例如欧几里得距离。较好的K值可以通过实验确定。

在下面这段代码中,我们导入KNN分类器,将之应用到我们的输入数据中,然后对花卉进行分类。

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier

# Load iris dataset from sklearn
iris = datasets.load_iris()

# Declare an of the KNN classifier class with the value with neighbors.
knn = KNeighborsClassifier(n_neighbors=6)

# Fit the model with training data and target values
knn.fit(iris['data'], iris['target'])

# Provide data whose class labels are to be predicted
X = [
    [5.9, 1.0, 5.1, 1.8],
    [3.4, 2.0, 1.1, 4.8],
]

# Prints the data provided
print(X)

# Store predicted class labels of X
prediction = knn.predict(X)

# Prints the predicted class labels of X
print(prediction)
AI 代码解读

输出:

[1 1]
AI 代码解读

其中,0,1,2分别代表不同的花。在该例子中,对于给定的输入,KNN分类器将它们都预测成为1这个类别的花。

KNN对IRIS数据集分类的直观可视化

9ef66cbc5c6de61285ee046bd2253d948e4e5d8b

回归

回归通常被定义为确定两个或多个变量之间的相关关系。例如,你要通过给定的数据X预测一个人的收入。这里,目标变量是指该变量是我们关心以及想要预测的未知变量,而连续是指Y的取值没有间隔。

预测收入是一个经典的回归问题。你的输入应当包含所有与收入相关的个人信息(比如特征),这些信息可以预测收入,例如工作时长、教育经历、职称以及他的曾住地等。

回归模型

一些常见的回归模型有

  • 线性回归
  • 逻辑回归
  • 多项式回归

线性回归通过拟合一条直线(回归线)来建立因变量(Y)与一个或多个自变量(X)之间关系。

用数学公示表示,即h(xi) = βo + β1 * xi + e,其中

βo是截距
β1是斜率
e是误差项

用图表示,即

d96301739e6315a3aa1ff35d4e04159e8271f266

逻辑回归是一种预测类别的算法,用于找出特征和特定输出概率之间关系。

当然了,我们也可以把逻辑回归归类为分类算法,但就像我们刚才所说,逻辑回归的输出其实是目标对象属于某一类别的概率。既然概率是连续的,我们依旧把逻辑回归算作回归算法。

用数学公式表示:p(X) = βo + β1 * X,其中p(x) = p(y = 1 | x)

图形表示为

144d5870bc4d301ed02a1eb98ba349d3690f00dd

多项式回归是一种将自变量x与因变量y的关系拟合为x的n阶多项式的回归算法。

解决线性回归问题

我们有数据集X,以及对应的目标值Y,我们使用普通最小二乘法通过最小化预测误差来拟合线性模型

给定的数据集同样划分为训练集和测试集。训练集由已知标签的样本组成,因此算法能够通过这些已知标签的样本来学习。测试集样本不包含标签,你并不知道你试图预测样本的标签值。

我们将选择一个需要训练的特征,应用线性回归方法拟合训练数据,然后预测测试集的输出。

用Sklearn实现线性回归

from sklearn import datasets, linear_model
AI 代码解读
 
import matplotlib.pyplot as plt import numpy as np # Load the diabetes dataset diabetes = datasets.load_diabetes() # Use only one feature for training diabetes_X = diabetes.data[:, np.newaxis, 2] # Split the data into training/testing sets diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # Split the targets into training/testing sets diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] # Create linear regression object regr = linear_model.LinearRegression() # Train the model using the training sets regr.fit(diabetes_X_train, diabetes_y_train) # Input data print('Input Values') print(diabetes_X_test) # Make predictions using the testing set diabetes_y_pred = regr.predict(diabetes_X_test) # Predicted Data print("Predicted Output Values") print(diabetes_y_pred) # Plot outputs plt.scatter(diabetes_X_test, diabetes_y_test, color='black') plt.plot(diabetes_X_test, diabetes_y_pred, color='red', linewidth=1) plt.show()

输入

输入值:

[
  [ 0.07786339]  [-0.03961813]  [ 0.01103904]  [-0.04069594]  
  [-0.03422907]  [ 0.00564998]  [ 0.08864151]  [-0.03315126] 
  [-0.05686312]  [-0.03099563]  [ 0.05522933]  [-0.06009656]
  [ 0.00133873]  [-0.02345095]  [-0.07410811]  [ 0.01966154]
  [-0.01590626]  [-0.01590626]  [ 0.03906215]  [-0.0730303 ]
  ]
AI 代码解读

预测的输出值:

[ 
 225.9732401   115.74763374  163.27610621  114.73638965   
 120.80385422  158.21988574  236.08568105  121.81509832  
 99.56772822   123.83758651  204.73711411   96.53399594  
 154.17490936  130.91629517   83.3878227   171.36605897
 137.99500384  137.99500384  189.56845268   84.3990668 
 ]
AI 代码解读
9aa3c8a0644ed2f0bd13d61ddaf1a4aa29926412
结语

提一下常用的监督学习的python库

  • Scikit-Learn
  • Tensorflow
  • Pytorch


原文发布时间为:2018-02-18

本文作者:文摘菌

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号

目录
打赏
0
0
0
0
73530
分享
相关文章
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。
Python爬虫实战:一键采集电商数据,掌握市场动态!
这个爬虫还挺实用,不光能爬电商数据,改改解析规则,啥数据都能爬。写爬虫最重要的是要有耐心,遇到问题别着急,慢慢调试就成。代码写好了,运行起来那叫一个爽,分分钟几千条数据到手。
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。

热门文章

最新文章