美文网首页
Python机器学习基础教程【第一章】

Python机器学习基础教程【第一章】

作者: 看远方的星 | 来源:发表于2023-02-01 20:09 被阅读0次

    本书的附加代码可以在 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主要是用于美化的,所以在此先忽略掉

    参考文章


    1. Pandas 数据结构 - DataFrame

    2. pandas库scatter_matrix绘图可视化参数详解

    3. 绘图的线型、颜色、标记

    相关文章

      网友评论

          本文标题:Python机器学习基础教程【第一章】

          本文链接:https://www.haomeiwen.com/subject/okoihdtx.html