本书的附加代码可以在 GitHub 下载:introduction to ml with python
监督学习算法(supervised learning algorithm)
无监督学习算法(unsupervised learning algorithm)
在机器学习中,这里的每个实体或每一行被称为一个样本(sample)或数据点,而每一列(用来描述这些实体的属性)则被称为特征(feature)。
如何构建良好的数据表征,这被称为特征提取(feature extraction)或特征工程(feature engineering)
scikit-learn 依赖于另外两个 Python 包:NumPy (Python 科学计算的基础包之一)和 SciPy( Python 中用于科学计算的函数集合)。
算法详细文档:https://scikit-learn.org/stable/index.html
用户指南:http://scikit-learn.org/stable/user_guide.html
若想绘图和进行交互式开发,还应该安装 matplotlib(Python 主要的科学绘图库)、IPython 和 Jupyter Notebook(在浏览器中运行代码的交互环境)。
pandas 是用于处理和分析数据的 Python 库。它基于一种叫作 DataFrame 的数据结构,这种数据结构模仿了 R 语言中的 DataFrame。
mglearn 库是我们为本书编写的实用函数库,以免将代码清单与绘图和数据加载的细节混在一起。
第一个应用
1、了解数据
in:
from sklearn.datasets import load_iris
iris_dataset = load_iris()
print("Keys of iris_dataset: \n{}".format(iris_dataset.keys()))
out:
Keys of iris_dataset: dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
- DESCR 键对应的值是数据集的简要说明
- target_names 键对应的值是一个字符串数组,里面包含我们要预测的花的品种
- feature_names 键对应的值是一个字符串列表,对每一个特征进行了说明
- data 里面是花萼长度、花萼宽度、花瓣长度、花瓣宽度的测量数据,格式为 NumPy 数组,data 数组的每一行对应一朵花,列代表每朵花的四个测量数据,数组中包含 150 朵不同的花的测量数据。
- target 是一维数组,每朵花对应其中一个数据,0 代表 setosa,1 代表 versicolor,2 代表 virginica
2、划分训练集和测试集
机器学习中的个体叫作样本(sample),其属性叫作特征(feature)。data 数组的形状(shape)是样本数乘以特征数。
一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练
集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set)。
train_test_split 函数可以打乱数据集并进行拆分。
scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)
image
image
- random_state 参数指定了随机数生成器的种子,保证这行代码的输出始终相同;
3、观察数据
如果不用机器学习能不能轻松完成任务,或者需要的信息有没有包含在数据中?检查数据也是发现异常值和特殊值的好方法。
检查数据的最佳方法之一就是将其可视化。
一种可视化方法是绘制散点图(scatter plot),用这种方法难以对多于 3 个特征的数据集作图。
解决这个问题的一种方法是绘制散点图矩阵(pair plot),从而可以两两查看所有的特征。散点图矩阵无法同时显示所有特征之间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。
训练集中特征的散点图矩阵:
# 利用X_train中的数据创建DataFrame
# 利用iris_dataset.feature_names中的字符串对数据列进行标记
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
# 利用DataFrame创建散点图矩阵,按y_train着色
grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
hist_kwds={'bins': 20}, s=60, alpha=.8)
image
绘制散点图矩阵函数: pandas的scatter_matrix。
版本较新换成:pd.plotting.scatter_matrix
pandas.DataFrame( data, index, columns, dtype, copy)
- data:一组数据(ndarray、series, map, lists, dict 等类型)[1]。
- index:索引值,或者可以称为行标签。
- columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
- dtype:数据类型。
- copy:拷贝数据,默认为 False。
scatter_matrix(frame, alpha=0.5, c,figsize=None, ax=None, diagonal='hist', marker='.', density_kwds=None,hist_kwds=None, range_padding=0.05, **kwds)
- frame,pandas dataframe对象[2]
- alpha, 图像透明度,一般取(0,1]
- figsize,以英寸为单位的图像大小,一般以元组 (width, height) 形式设置
- ax,可选一般为none
- diagonal,必须且只能在{‘hist’, ‘kde’}中选择1个,’hist’表示直方图(Histogram plot),’kde’表示核密度估计(Kernel Density Estimation);该参数是scatter_matrix函数的关键参数
- marker。Matplotlib可用的标记类型,如’.’,’,’,’o’等[3]
- density_kwds。(other plotting keyword arguments,可选),与kde相关的字典参数
- hist_kwds。与hist相关的字典参数
- range_padding。(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点
- kwds。与scatter_matrix函数本身相关的字典参数
- c。颜色
4、构建模型:k近邻算法
k 近邻分类器算法对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。
k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些邻居中数量最多的类别做出预测。
scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为 Estimator类。k 近邻分类算法是在 neighbors 模块的KNeighborsClassifier 类中实现的。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) # 实例化
# 基于训练集来构建模型
knn.fit(X_train, y_train)
fit 方法返回的是 knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。
5、预测
in:
X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print("Prediction: {}".format(prediction))
out:
Prediction: [0]
们模型的预测,这朵新的鸢尾花属于类别 0,也就是说它属于 setosa 品种。
6、评估模型
计算精度(accuracy)来衡量模型的优劣,精度就是品种预
测正确的花所占的比例。
in:
print("Test set score: {:.2f}".format(np.mean(y_pred == y_test)))
out:
Test set score: 0.97
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))
# knn 对象的 score 方法来计算测试集的精度,结果是一致的
对于测试集中的鸢尾花,我们的预测有 97% 是正确的。根据一些数学假设,对于新的鸢尾花,可以认为我们的模型预测结果有 97% 都是正确的。
7、总结
首先有150行样本,4列特征的鸢尾花(Iris)数据集。
鸢尾花(Iris)一共有三个品种:setosa、versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的品种被称为类别(class),每朵花的品种被称为它的标签(label)。
- 划分训练集和测试集(train_test_split 函数)
- 构建模型:k近邻算法(knn.fit 函数)
- 预测测试集(knn.predict 函数)
- 计算精度(knn.score 函数)
问题解决
name 'null' is not defined
Traceback (most recent call last):
File "d:\MyData\**\book-Python����ѧϰ�����̳�.ipynb", line 23, in <module>
"execution_count": null,
NameError: name 'null' is not defined
[Done] exited with code=1 in 0.198 seconds
重装Vscode中的jupyter插件
mglearn如何导入本地
1、下载包:https://github.com/amueller/introduction_to_ml_with_python
2、查看包的存放位置
cell中输入:%pip show pandas
,运行,查看包的位置(c:\users\用户名\appdata\local\programs\python\python310\lib\site-packages
)
3、把mglearn文件夹放到包的存放位置(c:\users\用户名\appdata\local\programs\python\python310\lib\site-packages
)
mylearn一些函数过时了,无法导入 :
image
mylearn主要是用于美化的,所以在此先忽略掉
网友评论