各位牛友们大家好,很高兴大家能看到我的读书笔记。我现在分享的是一本python机器学习的基础教程,总共有八章。我会分八个章节以读书笔记的形式分享给大家,不管写的好与坏,我都承诺坚持写下去。
第一章是引言;
什么是机器学习?机器学习就是从数据中提取知识,它是统计学、人工智能和计算机科学交叉的研究领域,也被称为预测分析(predictive)或统计学习(statistical leraning)。
为什么要选择机器学习?或者说机器学习能解决什么问题?先介绍两个概念:监督学习和无监督学习。
最成功的机器学习算法是能够将决策过程自动化的那些算法,这些决策过程是从一直事例中泛化得出的。在这种叫做监督学习(supervised learning)的方法中,用户将成对的输入和
预期的输出提供给算法,算***找到一种方法,根据给定输入给出预期输出。从输入/输出对中进行学习的机器学习算法叫做监督学习算法(supervised learning algorithm)。比如:
识别信封上手写的邮政编码、基于医学影象判断肿瘤是否为良性、检测信用卡交易中的诈骗行为。
另一种算法是无监督学习算法(unsupervised learning algorithm)。在无监督学习中,只有输入数据是已知的,没有为算法提供输出数据。虽然这种算法有许多成功的应用,但理解
和评估这些算法往往更加的困难。无监督学习的事例有;确定一系列博客文章的主题、将客户分成具有相似偏好的群组、检测网站的异常访问模式。
样本:在机器学习中,每个实体或每一行被称为一个样本 (sample)或数据点,而每一列(用来描述这些实体的属性)则被称为特征(feature)。构建良好的数据表证,被你称为特
征提取(feature extraction)。
接下来我们讲一个应用:鸢尾花分类
这是一个简单的机器学习应用,我们构建一个模型,同是还将介绍一些核心概念和术语。
假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有的测量结果的单位都是厘米。还有一
鸢尾花的数据,这些花之前已经被植物学家鉴定为属于setosa、versicolor或virginica三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。我么假设这位植物学爱好
者在野外只会遇到这三种鸢尾花。
我们的目标是构建一个机器学习的模型,可以从这些已知品种的鸢尾花的测量数据中进行学习,从而能够预测新鸢尾花的品种。
因为我们有已知品种的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中,我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题的示例。
可能的输出(鸢尾花的不同品种)叫做类别(class)。数据集中的每朵鸢尾花都属于三个类别之一,所以这是一个三分类问题。单个数据点(一朵鸢尾花)的预期输出是这朵花的品种。对于
一个数据点来说,它的品种叫做标签。
初始数据
本例中我们用到了鸢尾花(Iris)数据集,这是机器学习和统计学习中一个经典的数据集。它包含在scikit-learn的datasets模块中。我们可以调用load_iris函数来加载数据:
in[1]:
from sklearn.datasets import load_iris
iris_dataset = load_iris()
load_iris返回的iris对象是一个Bunch对象,与字典非常相似,里面包含键和值:
in[2]:
print("keys of iris_dataset: \n{}".format(iris_dataset.keys()))
out[2]:
keys of iris_dataset:
dict_keys(['target_names', 'feature_names', 'DESCR', 'data', 'target'])
DESCR键对应的值是数据集的简要说明。我们这里说明的开头部分(你可以自己查看其余的内容):
in[3]:
print(iris_dataset['DERCR'][:193] + "\n...")
out[3]:
Iris Plants Database
====================
Notes
----
Data Set Characteristics:
:Number of Instance: 150 (50 in each of three classes)
:Number of attributes: 4 numeric, predictive att
...
----
taget_names键对应的值是一个字符串数组,里面包含我们要预测的花的品种:
in[4]:
print("Target names: {}".format(iris_dataset['target_names']))
out[4]:
Target names: ['setosa' 'versicolor' 'virginica']
feature_names键对应的值是一个字符串列表,对每一个特征进行了说明:
in[5]:
print("Feature names: \n{}".format(iris_dataset['feature_names']))
out[5]:
Feature names:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',
'petal width (cm)']
数据包含在target和data字段中。data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量数据,格式为NumPy数组:
in[6]:print("Type of data: {}".format(type(iris_dataset['data'])))
out[6]:
Type of data: <class 'numpy.ndarray'>
data数组的每一行对应一朵花,列代表每朵花的四个测量数据;
in[7];
print("Shape of data: {}".format(iris_dataset['data'].shape))
out[7]:
shape of data: (150,4)
可以看出,数组中包含150朵不同的花的测量数据。前面说过,机器学习中的个体叫样本(sample),其属性叫做特征(feature)。data数组的形状(shape)是样本数乘以特征数。
这是scikit-learn中的约定,你的数据形状应始终遵循这个约定。下面给出前5个样本的特征数值:
in[8]:
print("First five rows of data:\n{}".format(iris_dataset['data'][:5]))
out[8]:
first five rows of data:
[[ 5.1 3.5 1.4 0.2]
[ 4.9 3. 1.4 0.2]
[ 4.7 3.2 1.3 0.2]
[ 4.6 3.1 1.5 0.2]
[ 5. 3.6 1.4 0.2 ]]
从数据中可以看出,前5朵花的花瓣宽度都是0.2cm,每一朵花的花萼最长,是5.1cm。target数组包含的是测量过的每朵花的品种,也是一个NumPy数组:
in[9]:
print("Type of target: {}".format(type(iris_dataset['target'])))
out[18]:
Type of target: <class 'numpy.ndarray'>
target是一维数组,每朵花对应其中一个数据:
in[10]:
print("shape of target:{}".format(iris_dataset['target'].shape))
out[10]:
shape of target:(150,)
品种被转换成从0到2的整数:
in[11]:
print("Target:\n{}".format(iris_dataset['target']))
out[11]:
target:
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
上述数字的代表含义由iris['target_names']数组给出:0代表setosa,1代表versicolor,2代表virginica。