机器学习笔记(一)
教材:
Python机器学习基础教程 Introduction to Machine Learning with Python
[德] Andreas C. Müller [美] Sarah Guido 著 张亮(hysic) 译
文章目录
为什么学习机器学习?
区别于“人为制定决策”,机器学习能够处理更加复杂,制定决策难以实现的问题
机器学习能解决的问题
最成功的机器学习算法是能够将决策过程自动化的那些算法,这些决策过程是从已知示例中泛化得出的。在这种叫作==监督学习(supervised learning)==的方法中,用户将成对的输入和预期输出提供给算法,算法会找到一种方法,根据给定输入给出预期输出。
从输入 / 输出对中进行学习的机器学习算法叫作监督学习算法(supervised learning algorithm),因为每个用于算法学习的样例都对应一个预期输出,好像有一个“老师”在监督着算法。
监督学习算法
- 识别信封上手写的邮政编码
- 基于医学影像判断肿瘤是否为良性
- 检测信用卡交易中的诈骗行为
无监督学习算法(unsupervised learning algorithm) 示例如下
- 确定一系列博客文章的主题
- 将客户分成具有相似偏好的分组
- 检测网站的异常访问模式
不论是监督学习,还是无监督学习算法,将输入数据表示成计算机能够理解的形式都是十分重要的。通常来说,想象成表格很有用。你想处理的每一个数据点(每一封电邮,每一次交易)对应表格的一行,描述该数据点的每一项属性(比如客户年龄,交易金额)对应表哥的一列。你可能会从年龄、性别、 账号创建时间、在你的购物网站上的购买频率等方面来描述用户。你可能会用每一个像素 的灰度值来描述肿瘤图像,也可能利用肿瘤的大小、形状和颜色进行描述。
在机器学习中,这里的每个实体或者每一行被称为一个样本(sample)或数据点,而每一列(用来描述实体的属性)则被称为特征(feature)
构建良好的数据表征,这被称为特征提取(feature extraction)或特征工程(feature engineering)
熟悉任务与数据
在机器学习过程中,最重要的部分就是理解你正在处理的数据,以及这些数据与你想要解决的问题的关系。随机选择一个算法把数据输入进去是不会有什么作用的。在开始构建模型之前,你需要理解数据集的内容,每一种算法的输入数据类型和最适合解决的问题都是不一样的。在构建机器学习解决方案的过程中,应该给出以下问题的答案,或只手要将这些问题记于脑中。
- 我想要回答的问题是什么?已经收集到的数据能够回答这个问题吗?
- 要将我的问题表示成机器学习问题,用哪种方案最好?
- 我收集的数据是否足以表达我想要解决的问题?
- 我提取了数据的哪些特征?这些特征能否实现正确的预测?
- 如何衡量应用是否成功?
- 机器学习解决方案与我的研究或者商业产品中的其他部分是如何相互影响的?
从更大层面看,机器学习算法和方法只是解决特定问题的过程中的衣服分,一定要始终牢记整个项目的大局。很多人浪费大量时间构建复杂的机器学习方案,最终发现没有解决正确的问题。当深入研究机器学习的技术细节是,很容易忽略最终目标。
机器学习所需要的技术包
- python
- scikit-learn:包含许多目前最先进的机器学习算法,每个算法都有详细的文档(http://scikit-learn.org/stable/documentation)
必要的库和工具
-
Jupyther Notebook:是可以在浏览器中运行代码的交互环境。这个工具在探索性数据分析方面 非常有用,在数据科学家中广为使用。
-
NumPy:是 Python 科学计算的基础包之一。它的功能包括多维数组、高级数学函数(比如
线性代数运算和傅里叶变换),以及伪随机数生成器。
import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6]])
print("x:\n{}".format(x))
x:
[[1 2 3]
[4 5 6]]
- SciPy:是 Python 中用于科学计算的函数集合。它具有线性代数高级程序、数学函数优化、 信号处理、特殊数学函数和统计分布等多项功能。SciPy 中最重要的是 scipy.sparse:它可以给出稀疏矩阵(sparse matrice),稀疏矩阵是 scikit-learn 中数据的另一种表示方法。如果想保存一个大 部分元素都是 0 的二维数组
from scipy import sparse
# 创建一个二维NumPy数组,对角线为1,其余都为0 eye = np.eye(4)
print("NumPy array:\n{}".format(eye))
NumPy array:
[[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]]
# 将NumPy数组转换为CSR格式的SciPy稀疏矩阵
# 只保存非零元素
sparse_matrix = sparse.csr_matrix(eye)
print("\nSciPy sparse CSR matrix:\n{}".format(sparse_matrix))
SciPy sparse CSR matrix:
(0, 0) 1.0
(1, 1) 1.0
(2, 2) 1.0
(3, 3) 1.0
通常来说,创建稀疏数据的稠密表示(dense representation)是不可能的(因为太浪费内存),所以我们需要直接创建其稀疏表示(sparse representation)。下面给出的是创建同一 稀疏矩阵的方法,用的是 COO 格式:
data = np.ones(4)
row_indices = np.arange(4)
col_indices = np.arange(4)
eye_coo = sparse.coo_matrix((data, (row_indices, col_indices)))
print("COO representation:\n{}".format(eye_coo))
COO representation:
(0, 0) 1.0
(1, 1) 1.0
(2, 2) 1.0
(3, 3) 1.0
- matplotlib:是 Python 主要的科学绘图库,其功能为生成可发布的可视化内容,如折线图、直方图、散点图等。在 Jupyter Notebook 中,你可以使用 %matplotlib notebook和%matplotlib inline命令,将图像直接显示在浏览器中。
%matplotlib inline
import matplotlib.pyplot as plt
# 在-10和10之间生成一个数列,共100个数
x = np.linspace(-10, 10, 100)
# 用正弦函数创建第二个数组
y = np.sin(x)
# plot函数绘制一个数组关于另一个数组的折线图
plt.plot(x, y, marker="x")
- pandas:是用于处理和分析数据的Python库。它基于一种叫作DataFrame的数据结构,这种数据结构模仿了R语言中的DataFrame。简单来说一个DataFrame是一张表格,类似于Excel表格。pandas中包含大量用于修改表格和操作表格的方法,尤其是可以像SQL一样对表格进行查询和连接。NumPy要求数组中的所有元素类型必须完全相同,而pandas不是这样,每一列数据的类型可以互不相同(比如整型、日期、浮点数和字符串)。pandas的另一个强大之处在于,它可以从许多文件格式和数据库中提取数据,如 SQL、Excel 文件和逗号分隔值(CSV)文件。
import pandas as pd
from IPython.display import display
# 创建关于人的简单数据集
data = {'Name': ["John", "Anna", "Peter", "Linda"],
'Location' : ["New York", "Paris", "Berlin", "London"],
'Age' : [24, 13, 53, 33]
}
data_pandas = pd.DataFrame(data)
# IPython.display可以在Jupyter Notebook中打印出“美观的”DataFrame display(data_pandas)
查询这个表格还有很多例子,例如:
# 选择年龄大于30的所有行
display(data_pandas[data_pandas.Age > 30])
- mglearn:用来快速美化绘图,或者用于获取一些有趣的数据。
Jupyter Notebook 中运行代码,并使用 %matplotlib notebook 或 %matplotlib inline 命令来显示图像。如果你没有使用 Jupyter Notebook 或这些命令,那么就需要调用 plt.show 来显示图像。
我用到的工具的版本
import sys
print("Python version: {}".format(sys.version))
import pandas as pd
print("pandas version: {}".format(pd.__version__))
import matplotlib
print("matplotlib version: {}".format(matplotlib.__version__))
import numpy as np
print("NumPy version: {}".format(np.__version__))
import scipy as sp
print("SciPy version: {}".format(sp.__version__))
import IPython
print("IPython version: {}".format(IPython.__version__))
import sklearn
print("scikit-learn version: {}".format(sklearn.__version__))
Python version: 3.8.5 (default, Sep 4 2020, 02:22:02)
[Clang 10.0.0 ]
pandas version: 1.1.3
matplotlib version: 3.3.2
NumPy version: 1.19.2
SciPy version: 1.5.2
IPython version: 7.19.0
scikit-learn version: 0.23.2