机器学习入门——使用python进行监督学习

什么是监督学习?

在监督学习中,我们首先要导入包含训练特征和目标特征的数据集。监督式学习算法会学习训练样本与其相关的目标变量之间的关系,并应用学到的关系对全新输入(无目标特征)进行分类。

为了说明如何监督学习的原理,让我们看一个根据学生学习的时间来预测学生的成绩的例子。

公式:

Y = f(X)+ C

在这里:

F表示学生为考试准备的小时数和分数之间的关系 X是输入(他睡觉的小时数) Y是输出(标记在考试中学生的得分) C是随机误差

监督学习算法的最终目标是以最大精度来预测给定新输入X所对应的Y.有很多种方法可以实现监督学习; 我们在这里讨论一些最常用的方法。

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

分类:输出标签:这个是猫还是狗?
回归:这个房子卖多少钱?

分类

以想要分析乳腺癌的数据的医学研究人员为例。目标是预测患者应接受三种治疗方法中的哪一种。这种数据分析任务被称为分类,在这个分类中,模型或分类器被构造来预测类标签,例如“治疗a”、“治疗B”或“治疗c”。

分类是预测问题,预测离散和无序的分类的类标签。这一过程,由学习步骤和分类步骤两部分组成。

分类中方法

最常用的分类算法:

1.KNN算法(K-Nearest Neighbo)

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 sklearnimport 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中的KNN

如果一个算法只是简单地存储训练集的元组并等待给出测试元组,那么他就是一个惰性学习法。只有当它看到测试元组时才会执行泛化,基于它与训练元组的相似度对元组进行分类。

KNN是一个惰性学习法。

KNN基于类比学习,比较出给定的测试元组与训练元组的相似度。训练元组由n个特征描述。每个元组代表一个n维空间中的一个点。这样,所有的训练元组都存储在n维模式空间中。当给定未知元组时,KNN分类器在模式空间中搜索最接近未知元组的k个训练元组。这k个训练元组是未知元组的k个“最近邻(nearest neighbor)”。

贴近度(Closeness)由关于距离的度量定义(例如欧几里得度量)。一个好的K值要通过实验确定。

在这段代码中,我们从sklearn中导入KNN分类器,并将其应用到我们的输入数据,对花进行分类。

from sklearnimport datasets
from sklearn.neighborsimport 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对应的Virginica 2对应Setosa

(注:都是鸢尾花的种类)

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

IRIS数据集分类直观图:

回归

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

在回归里,目标变量是指我们想要预测的未知变量,连续意味着Y可以承担的值没有缺口(或者说间断点)。

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

回归模型

一些常用的回归模型是:

  • 线性回归
  • Logistic回归
  • 多项式回归

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

用公式表示:

h(xi)=βo+β1* xi + e

其中βo是截距,β1是线的斜率,e是误差项。

线性回归

Logistic回归是一种算法,可以在响应变量是分类(categorical)时使用。Logistic回归的思想是找出特征和特定结果的概率之间的关系。

用公式表示为:

p(X)=βo+β1* X

p(x)= p(y = 1 | x)

Logistic回归

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

解决线性回归问题:

我们有数据集X和相应的目标值Y,我们使用最小二乘法来学习一个线性模型,我们可以使用这个线性模型来预测一个新的y,给出一个未知的x,它的误差越小越好。

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

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

线性回归在scikit-learn中的实现:

from sklearnimport 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
]

预测diabetes_X_test和diabetes_y_pred之间的图在线性方程上连续。

  • 代码:https://github.com/vihar/supervised-learning-with-python

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2018-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法工程师

基础|认识机器学习中的逻辑回归、决策树、神经网络算法

作者:石文华 编辑:田 旭 逻辑回归 1 逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,...

3838
来自专栏WD学习记录

机器学习 学习笔记(18) 提升树

提升树是以分类树或回归树为基本分类器的提升方法,提升树被认为是统计学习中性能最好的方法之一。

2364
来自专栏社区的朋友们

机器学习概念总结笔记(三)

C4.5 算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4....

7331
来自专栏杨熹的专栏

权重初始化的几个方法

其中第一步 权重的初始化 对模型的训练速度和准确性起着重要的作用,所以需要正确地进行初始化。

2162
来自专栏决胜机器学习

机器学习(十六) ——SVM理论基础

机器学习(十六)——SVM理论基础 (原创内容,转载请注明来源,谢谢) 一、概述 支持向量机(supportvector machine,SVM),是一种分类...

3787
来自专栏数据科学学习手札

(数据科学学习手札34)多层感知机原理详解&Python与R实现

  机器学习分为很多个领域,其中的连接主义指的就是以神经元(neuron)为基本结构的各式各样的神经网络,规范的定义是:由具有适应性的简单单元组成的广泛并行互连...

6329
来自专栏闪电gogogo的专栏

IEEE Trans 2007 Signal Recovery From Random Measurements via OMP

  看了一篇IEEE Trans上的关于CS图像重构的OMP算法的文章,大部分。。看不懂,之前在看博客的时候对流程中的一些标号看不太懂,看完论文之后对流程有了一...

1975
来自专栏专知

网络节点表示学习论文笔记02—CIKM2015GraRep: 基于全局结构信息的图结点表示学习

【导读】这次论文笔记介绍了介绍一种具有代表性的网络节点表示学习(NRL)方法:GraRep。以LINE为代表的一系列NRL算法一些网络上具有很好地学习效果,但它...

7137
来自专栏机器学习算法与Python学习

机器学习(7) -- k-means 聚类

根据大家的提议,从今天起每次算法介绍完之后会给大家一个用python编写的实例刚打架参考 Clustering  9. Clustering     9.1...

3845
来自专栏深度学习入门与实践

一文弄懂神经网络中的反向传播法——BackPropagation

本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢! 最近在看深度学习的东西,一开始看的吴恩达的...

42610

扫码关注云+社区

领取腾讯云代金券