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

转载自 小白学数据:教你用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


在下面这段代码中,我们使用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())


输出:


<class ‘sklearn.datasets.base.Bunch’>
dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])]
<class ‘numpy.ndarray’> <class ‘numpy.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


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)


输出:


[1 1]


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


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



回归


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


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


回归模型


一些常见的回归模型有

  • 线性回归

  • 逻辑回归

  • 多项式回归


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


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

  • βo是截距

  • β1是斜率

  • e是误差项


用图表示,即


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


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


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


图形表示为


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


解决线性回归问题


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


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


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


用Sklearn实现线性回归


from sklearn import datasets, linear_model
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 ]
 ]


预测的输出值:


[ 
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
]

结语


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

  • Scikit-Learn

  • Tensorflow

  • Pytorch


最后布置一个作业:请根据文章内容,用监督学习推测一下今天的文摘菌是哪位帅哥小编~


原文链接:https://towardsdatascience.com/supervised-learning-with-python-cf2c1ae543c1



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

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

相关文章

Spring_01_IoC初级总结

1.IoC简介 (转载) (原文&#xff1a;http://jinnianshilongnian.iteye.com/blog/1413846) via:jinnianshilongnian 1.1、IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Io…

深度学习工具caffe详细安装指南

转载自 深度学习工具caffe详细安装指南前言&#xff1a; 在一台系统环境较好的linux机器上可以很容易的安装caffe&#xff0c;但是如果系统本身很旧&#xff0c;又没有GPU的话&#xff0c;安装就太麻烦了&#xff0c;所有都得从头做起&#xff0c;本文档旨在尽可能覆盖安装所要…

Spring_02_AOP初级总结

1.AOP简介 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 可以理解为一个拦截器框架&#xff0c;但是这个拦截器会非常武断&#xff0c;如果它拦截一个类&#xff0c;那么它就会拦截这个类中的所有方法。如对一个目标列的代理&#xff0c;增强了目标类的所有方法…

spring(11)使用对象-关系映射持久化数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(11)使用对象-关系映射持久化数据” 的相关知识&#xff1b;【2】spring 与 java 持久化API1&#xff09;intro&#xff1a;…

漫画:什么是数据仓库

转载自 玻璃猫 算法与数据结构一个故事 在很久很久以前&#xff0c;世界上生活着许多种族&#xff0c;有人类&#xff0c;有矮人&#xff0c;有精灵......他们有着不同的信仰&#xff0c;不同的文化&#xff0c;彼此相安无事。可是&#xff0c;有一个猥琐男却偏偏想要统治整个世…

SpringMVC_初级总结

1.SpringMVC的工作原理 浏览器发出一个http请求给服务器&#xff0c;如果匹配DispatcherServlet的请求映射路径&#xff08;在web.xml中指定&#xff09;&#xff0c;服务器将请求转交给DispatcherServlet.DipatcherServlet接收到这个请求之后&#xff0c;根据请求的路径&#…

tomcat中配置jndi数据源以便spring获取

【0】README0&#xff09;intro to jndi&#xff0c; plase visit intro to jndi&#xff1b;1&#xff09;本文译自 Configuring Spring MVC JdbcTemplate with JNDI Data Source in Tomcat&#xff1b;2&#xff09;本文旨在分析如何通过springmvc 获取 JNDI 数据源 以连接到…

Machine Learning:十大机器学习算法

转载自 Machine Learning&#xff1a;十大机器学习算法摘要: - 机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 - 基本的机器学习算法&#xff1a;线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强 机…

Java的值传递解析

值传递与引用传递 最近学基础的时候&#xff0c;老师讲了值传递和引用传递&#xff0c;这个问题一直不太明白&#xff0c;上网查了很多资料&#xff0c;按照自己的理解整理了一遍&#xff0c;发现之前不太明白的地方基本上想明白了&#xff0c;如有不正确的地方&#xff0c;欢…

spring(13)缓存数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(13)缓存数据” 的相关知识&#xff1b;2&#xff09;缓存&#xff1a;缓存可以存储经常会用到的信息&#xff0c;这样每次需…

漫画:什么是分布式事务

转载自 漫画&#xff1a;什么是分布式事务&#xff1f;————— 第二天 —————————————————假如没有分布式事务 在一系列微服务系统当中&#xff0c;假如不存在分布式事务&#xff0c;会发生什么呢&#xff1f;让我们以互联网中常用的交易业务为例子&#…

Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合

【0】README0&#xff09;本文旨在 review Spring4.2.6SpringMVC4.2.6MyBatis3.4.0 整合过程&#xff1b;1&#xff09;项目整合所涉及的源代码&#xff0c;please visit https://github.com/pacosonTang/MyBatis/tree/master/spring4mvc_mybatis32&#xff09;由于晚辈我还不…

ibatis(0)ibatis 与 mybatis 简述

【0】README:1&#xff09;本文旨在给出 ibatis 与 mybatis 简述&#xff0c;简述内容转自 如下链接&#xff1b;【1】main contents1&#xff09;apache offical declarationhttp://ibatis.apache.org/.apache ibatis is retired at the apache software foundation (2010/06/…

Java面试大纲

转载自 金三银四跳槽季&#xff0c;Java面试大纲跳槽时时刻刻都在发生&#xff0c;但是我建议大家跳槽之前&#xff0c;先想清楚为什么要跳槽。切不可跟风&#xff0c;看到同事一个个都走了&#xff0c;自己也盲目的面试起来&#xff08;期间也没有准备充分&#xff09;&#x…

ibatis(1)ibatis的理念

【0】README1&#xff09;本文部分内容转自 “ibatis in action”&#xff0c;旨在 review “ibatis的理念” 的相关知识&#xff1b;【1】结合所有优秀思想的混合型解决方案在现实世界中&#xff0c;混合型解决方案随处可见。将两个看上去相悖的思想在中间处巧妙结合&#xff…

究竟啥才是互联网架构“高并发”

转载自 究竟啥才是互联网架构“高并发”一、什么是高并发 高并发&#xff08;High Concurrency&#xff09;是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间…

ibatis(2)ibatis是什么

【0】README1&#xff09;本文部分内容转自 “ibatis in action”&#xff0c;旨在 review “ibatis是什么” 的相关知识&#xff1b;2&#xff09;intro to ibatis&#xff1a; ibatis 就是数据映射器&#xff0c;Martin Fowler在《企业应用架构模式》中&#xff0c;对 data m…

究竟啥才是互联网架构“高可用”

转载自 究竟啥才是互联网架构“高可用”一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说…

maven(3)maven3.3.9使用入门

【0】README1&#xff09;maven 安装step1&#xff09;检查 jdk 是否安装且 环境变量 JAVA_HOME 是否设置&#xff1b;step2&#xff09;download maven&#xff1a; https://maven.apache.org/download.cgi?Preferredftp://mirror.reverse.net/pub/apache/step3&#xff09;…

TCP接入层的负载均衡、高可用、扩展性架构

转载自 TCP接入层的负载均衡、高可用、扩展性架构 一、web-server的负载均衡 互联网架构中&#xff0c;web-server接入一般使用nginx来做反向代理&#xff0c;实施负载均衡。整个架构分三层&#xff1a; 上游调用层&#xff0c;一般是browser或者APP 中间反向代理层&#xff…