手把手教你监督学习(附python实战代码)

简介: 想学监督学习?底子一定要打好!

97c27efc8363ac10a286fc8e4dc1c023b963d771

为什么选择人工智能和机器学习?

人类的未来是人工智能/机器学习。任何不了解的它们的人很快就会发现自己已经落后了。在这个充满创新的世界中醒来感觉科技越来越像魔术。有许多种方法和技术来执行人工智能和机器学习来解决实时问题,其中监督学习是最常用的方法之一。

什么是监督学习?

在监督学习中,我们从导入包含训练属性和目标属性的数据集开始。监督式学习算法将学习训练样本与其相关目标变量之间的关系,并应用该学习关系对全新输入(无目标)进行分类。

为了说明监督学习是如何工作的,让我们从一个根据他学习的小时数来预测学生分数的例子。

在数学上,Y = f(X)+ C

其中,f将是标记学生为考试准备的小时数之间的关系;

X是INPUT(他准备的小时数);

Y是输出(标记在考试中得分的学生);

C将是随机错误。

监督学习算法的最终目标是以给定的新输入X,输出最大精度预测Y。算法工程师们已经发明了几种方法来实现监督学习,我们将探索一些最常用的方法。

基于给定的数据集,机器学习问题分为两类:分类和回归。如果给定的数据同时具有输入(训练)值和输出(目标)值,那么这是一个分类问题。如果数据集具有不带任何目标标签的属性的连续数值,则它属于回归问题。例如:

分类:有输出标签,它是猫还是狗?

回归:房子卖多少钱?

分类

举一个一位希望分析乳腺癌数据的医学研究人员的例子,以预测患者应接受三种特定治疗中的哪一种。该数据分析任务被称为分类,其中构建模型或分类器以预测类别标签,诸如“处理A”,“处理B”或“处理C”。

分类是预测问题,包括分类预测和分类无序的类别标签。这是一个两步过程,由学习步骤和分类步骤组成。

分类的最佳方法

一些最常用的分类算法

1.K-最近邻;

2.决策树;

3.朴素贝叶斯;

4.支持向量机;

在学习步骤中,分类模型通过分析训练集来建立分类器。在分类步骤中是预测给定数据的类别标签。分析中的数据集元组及其关联的类标签被分成一个训练集和测试集。构成训练集的各个元组从随机抽样的数据集中进行分析。剩余的元组形成测试集并且独立于训练元组,这意味着它们不会用于构建分类器。

测试集用于估计分类器的预测准确度。分类器的准确性是分类器正确分类的测试元组的百分比。为了获得更高的精度,最好的方法是测试不同的算法,并在每个算法中尝试不同的参数。最好的一个可以通过交叉验证来选择。

要针对某个问题选择一个好的算法,对于不同的算法必须考虑准确性、训练时间、线性、参数数量和特殊情况等参数

教程:基于IRIS数据集的Scikit-Learn中实现KNN,根据给定的输入对花的类型进行分类。

第一步,为了应用我们的机器学习算法,我们需要了解和探索给定的数据集。在这个例子中,我们使用从scikit-learn软件包导入的IRIS数据集。

现在让我们深入代码并探索IRIS数据集。

确保你的机器上安装了Python。另外,使用PIP安装以下软件包:

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

Scikit-learn中的K-最近邻居

如果一个算法仅仅存储了训练集的元组并且等待给出测试元组,那么就被认为是一个懒惰学习者。只有当它看到测试元组时才会执行泛化,以便根据元组与存储的训练元组的相似性对元组进行分类。

K-最近邻分类器就是一个懒惰的学习者。

KNN基于类比学习,即将给定的测试元组与类似的训练元组进行比较。训练元组由n个属性描述,每个元组代表一个n维空间中的一个点。这样,所有训练元组都存储在n维模式空间中。当给定未知元组时,k-最近邻分类器在模式空间中搜索最接近未知元组的k个训练元组。这k个训练元组是k未知元组的k个“最近邻居”。

在下面这个代码段中,我们从sklearn提供进口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对应Versicolor

1对应Virginic 

2对应Setosa

基于给定的输入,机器使用KNN预测两种花是Versicolor。

KNN直观的IRIS数据集分类

7188095232ef8d67e8fd75bf9a3725f8704d71f2

回归

回归通常被称为确定两个或更多变量之间的关系。例如,考虑你必须根据给定的输入数据X来预测一个人的收入。

这里的目标变量意味着我们关心预测的未知变量,连续意味着Y可以承担的值不存在间隙(不连续性)。

预测收入是一个典型的回归问题。你的输入数据应该包含所有可以预测收入的信息(称为特征),例如他的工作时间、教育经历、职位、他住的地方。

流行的回归模型

一些常用的回归模型是:

·线性回归

·Logistic回归

·多项式回归

线性回归使用的是最佳拟合直线(也称为回归线)建立因变量(Y)与一个或多个自变量(X)之间的关系。

在数学上,h(xi)=βo+β1* xi + e其中βo是截距,β1是线的斜率,e是误差项。

从图形上看,

 89f472aa44e054e3621d520f3f8a7cc4cd53353f

Logistic Regression是一种算法,用于响应变量是分类的地方。Logistic回归的想法是找出特征与特定结果的概率之间的关系。

在数学上,p(X)=βo+β1* X,其中p(x)= p(y = 1 | x)

从图形上看,

 9422716556bbe074b07c81bc955bee472120fdb5

多项式回归是一种回归分析的形式,其中自变量x和因变量y之间的关系被建模为x中的n次多项式。

解决线性回归问题

我们有我们的数据集X和相应的目标值Y,我们使用普通最小二乘来学习一个线性模型,我们可以用它来预测一个新的y,给出一个以前看不见的x,尽可能小的误差。

给定的数据被分成一个训练数据集和一个测试数据集。训练集具有标签(特征加载),所以算法可以从这些标记的例子中学习。测试集没有任何标签,也就是说,你还不知道试图预测的价值。

我们将考虑一个要素进行训练,并应用线性回归方法拟合训练数据,然后使用测试数据集预测输出。

在scikit-learn中实现线性回归

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()

输出:

Input Values
[
[ 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 ]
]
Predicted Output Values
[ 
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 
]
837112cc128cba74c598a7f10b2ed838453c461f

(糖尿病_X_测试,糖尿病_y_pred)预测之间的图将在线方程上连续。

结束笔记

用于监督机器学习的其他Python软件包。

Scikit-LearnTensorflowPytorch

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

本文由@爱可可爱生活@阿里云云栖社区组织翻译。

文章原标题《supervised-learning-with-python》,

译者:虎说八道,审校:袁虎。

文章为简译,更为详细的内容,请查看原文 

相关文章
|
5天前
|
并行计算 C语言 开发者
优化Python代码的五大技巧
Python作为一种流行的编程语言,在各种应用场景中广泛使用。然而,随着项目规模的增长和需求的变化,Python代码的性能和可维护性也成为了关键问题。本文将介绍优化Python代码的五大技巧,帮助开发者提升代码效率和质量。
|
15天前
|
监控 Python
Python中的装饰器:提升代码灵活性与可读性
在Python编程中,装饰器是一种强大的工具,能够提升代码的灵活性和可读性。本文将介绍装饰器的基本概念、使用方法以及实际应用场景,帮助读者更好地理解和利用这一功能。
|
4天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
16天前
|
缓存 监控 算法
优化Python代码性能的10个技巧
提高Python代码性能是每个开发者都需要关注的重要问题。本文将介绍10个实用的技巧,帮助你优化Python代码,提升程序的运行效率和性能表现。无论是避免内存泄漏、减少函数调用次数,还是使用适当的数据结构,都能在不同场景下发挥作用,使你的Python应用更加高效稳定。
|
1天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
18 0
|
1天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
5 0
|
1天前
|
Linux 网络安全 开发工具
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
10 0
|
2天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性和灵活性
Python中的装饰器是一种强大的编程工具,能够提升代码的可读性和灵活性。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器来简化代码、实现日志记录、权限控制等功能,从而让你的Python代码更加优雅和高效。
|
4天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
5天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6

热门文章

最新文章