机器学习与Python应用(一)

本贴为学习记录贴,有任何问题随时可以交流。
课程名称:机器学习与数据挖掘
使用教材:《Python机器学习》/赵涓涓,强彦主编.——北京:机械工业出版社,2019.06
记录时间:2021.03.21
本节说明:除去安装和基础语法使用,主要讲Python及其第三方库的数据结构的使用、Jupyter Notebook操作以及常用IPython命令等内容,在为后面快捷使用编程工具、数据处理以及模型实现等打下基础。

一、环境配置查看

1、打开jupyter notebook,使用.ipynb文件输入下面代码来查看环境配置:

!conda -V
!jupyter --version
!python --version
!conda list Your_packages

2、得到相关的环境配置情况:

系统:Windows 10
Anaconda – 4.9.2
jupyter notebook – 6.0.1
Python – 3.7.4
numpy – 1.16.5
pandas – 1.2.3
sklearn – 0.21.3
matplotlib – 3.3.4

二、数据结构

该部分主要讲解Python自身的list、Numpy库的ndarray和Pandas库的SeriesDataFrame的关系。
注意:Python除了list外,还有tuplesetdict这些主要的数据结构同样需要了解。)

list

  • 多个元素构成一个整体,但元素的数据类型不一定是相同的。

ndarray

  • 一般来说,元素的数据类型设置dtypes为相同的,能进行广播、标量运算和矢量运算。

  • 运行效率高和内存占用少,底层由C写的,内部解除GIL而不受Python解释器限制。

  • Listndarray可以相互转换:

    
    list_0 = [1, 2, 3]
    nd1 = np.array(list_0)
    l1 = list(nd1)
    print("nd1的类型为:", type(nd1))
    print("L2的类型为:", type(l1))
    
    >>> nd1的类型为: <class 'numpy.ndarray'>
    >>> L2的类型为: <class 'list'>
    
  • ndarray可以对数组进行重塑,如一维向量转成二维数组。

    nd1 = np.array([1, 2, 3])
    print("nd1未更新前的结构:", nd1.shape)
    nd1 = nd1.reshape(-1, 1)
    print("nd1更新后的结构:", nd1.shape)
    
    >>> nd1未更新前的结构: (3,)
    >>> nd1更新后的结构: (3, 1)
    

Series

  • 一维数组,具有一组索引index,可以通过index索引对应的value

  • Listndarrayseries可以相互转换

    
    list_0 = [1, 2, 3]
    s1 = pd.Series(list_0)
    nd1 = np.array(s1)
    l1 = list(s1)   # 或者使用s1.tolist()
    print("输出s1为:\n{}".format(s1))
    print("s1的类型为:", type(s1))
    print("nd1的类型为:", type(nd1))
    print("输出l1为:\n{}".format(l1))
    print("l1的类型为:", type(l1))
    
    >>> 输出s1为:
        0    1
        1    2
        2    3
        dtype: int64
    >>> s1的类型为: <class 'pandas.core.series.Series'>
    >>> nd1类型为: <class 'numpy.ndarray'>
    >>> 输出l1为:
        [1, 2, 3]
    >>> l1的类型为: <class 'list'>
    
  • dictseries的相互转换

    list的区别在于:
    list会把每个元素的下标作为index,而dict会把其key传进index中,与value一一对应。

    d0 = {
         'a':1, 'b':2, 'c':3}
    s1 = pd.Series(d0)
    d1 = dict(s1)   # 或者使用s1.to_dict()
    print("输出s1为:\n{}".format(s1))
    print("s1的类型为:", type(s1))
    print("输出d1为:\n{}".format(d1))
    print("d1的类型为:", type(d1))
    
    >>> 输出s1为:
        a    1
        b    2
        c    3
        dtype: int64
    >>> s1的类型为: <class 'pandas.core.series.Series'>
    >>> 输出d1为:
        {
         'a': 1, 'b': 2, 'c': 3}
    >>> d1的类型为: <class 'dict'>
    
  • ndarrayseries的特殊转化,注意series是没有reshape属性,必须先转成ndarray

    Series.values转成ndarray常用于升维,实现一维列向量转置成一维行向量,或是实现矩阵相乘

    s1 = pd.Series([1, 2, 3])     
    nd1 = s1.values                 
    nd1_new = nd1.reshape(-1, 1)
    print("s1的结构为:", s1.shape)
    print("nd1未更新的结构为:", nd1.shape)
    print("nd1更新后的结构为:", nd1_new.shape)
    
    >>> s1的结构为: (3,)
    >>> nd1未更新的结构为: (3,)
    >>> nd1更新后的结构为: (3, 1)
    

DataFrame

  • 二维数组,由两组索引(index, column)values组成,可以看成由多个Series按列合并成,可以通过columnindex索引对应的value
  • listndarraySeriesDataFrame之间的转换
    注意: DataFrame不能直接用tolist(),需要先转成ndarray或者Series类型
    l0 = [1, 2, 3]
    df1 = pd.DataFrame(l0)   # 默认生成column为0,index为l0的下标,value为对应值
    df1[1] = l0     # 生成column为1,index为l0的下标,value为对应值
    nd1 = df1.values    # DataFrame转成ndarray
    l1 = nd1.tolist()   # 将通过ndarray间接将DataFrame的值转成list
    
    print("输出df1为:\n{}".format(df1))
    print("df1的类型为:", type(df1))
    print("输出nd1为:\n{}".format(nd1))
    print("nd1的类型为:", type(nd1))
    print("输出l1为:\n{}".format(l1))
    print("l1的类型为:", type(l1))
    
    >>> 输出df1为:
           0  1
        0  1  1
        1  2  2
        2  3  3
    >>> df1的类型为: <class 'pandas.core.frame.DataFrame'>
    >>> 输出nd1为:
          [[1 1]
           [2 2]
           [3 3]]
    >>> nd1的类型为: <class 'numpy.ndarray'>
    >>> 输出l1为:
        [[1, 1], [2, 2], [3, 3]]
    >>> l1的类型为: <class 'list'>
    
  • dictDataFrame的转换
    # 第一种,传入单条数据,外层key的value是不可迭代的,需要设定index,而外层key为column
    d1 = {
         'a':1, 'b':2, 'c':3}
    df1 = pd.DataFrame(d1, index=[0])
    
    # 第二种,传入单条数据,外层key的value是可迭代的(有下标),index为value对应的下标,外层key为column
    d2 = {
         'a':[1], 'b':[2], 'c':[3]}
    df2 = pd.DataFrame(d2)
    
    # 第三种,传入多条数据,外层key的value是可迭代的,index为对应value的下标,外层key为column
    d3 = {
         'a':[1,2,3], 'b':[1,2,3], 'c':[1,2,3]}
    df3 = pd.DataFrame(d3)
    
    # 第四种,传入多条数据,index为内层的key,[内层key, 外层key]索引到对应的value,即外层key为column,内层key为index
    d4 = {
         'a':{
         'X':1,'Y':2, 'Z':3}, 'b':{
         'X':1,'Y':2, 'Z':3}, 'c':{
         'X':1,'Y':2, 'Z':3}}
    df4 = pd.DataFrame(d4)
    
    # 第五种,传入单条数据,传入字典的key作为index,外层key的value是不可迭代,则默认使用id作为column
    d5 = {
         'a':1, 'b':2, 'c':3} 
    df5 = pd.DataFrame.from_dict(d5, orient='index')  # id为0,生成column为0,index为['a','b','c']
    
    # DataFrame转成dict
    df0 = d4
    d0 = df0.to_dict()
    
    for i, j in zip(['df1','df2','df3','df4','df5'],[df1,df2,df3,df4,df5]):
        print("输出{}为:\n{}".format(i,j))
    print("-"*5,"dict转成Dataframe", "-"*5)
    for i, j in zip(['df0','d0'],[df0,d0]):
        print("输出{}为:\n{}\n".format(i, j))
        print("{}的类型为:{}\n".format(i,type(j)))
    
    输出的结果如下:
    >>> 输出df1为:
           a  b  c
        0  1  2  3
        1  1  2  3
        2  1  2  3
    >>> 输出df2为:
           a  b  c
        X  1  1  1
        Y  2  2  2
        Z  3  3  3
    >>> 输出df3为:
          a  b  c
        0  1  1  1
        1  2  2  2
        2  3  3  3
    >>> 输出df4为:
           0  1
        a  1  1
        b  2  2
        c  3  3
    >>> 输出df5为:
           a  b  c
        0  1  2  3
    >>> ----- dict转成Dataframe -----
    >>> 输出df0为:
           0  1
        a  1  1
        b  2  2
        c  3  3
    >>> df0的类型为:<class 'pandas.core.frame.DataFrame'>
    
    >>> 输出d0为:
        {
         0: {
         'a': 1, 'b': 2, 'c': 3}, 1: {
         'a': 1, 'b': 2, 'c': 3}}
    >>> d0的类型为:<class 'dict'>
    
  • ndarraySeriesDataFrame三者比较
    • 1、Series是一维的,即Series.ndim为1;DataFrame是二维的,即DataFrame.ndim为2;而对于数组ndarray可以是任意维度。

    • 2、SeriesDataFrame都是带有索引,既可以用索引,也可以用下标去访问对应的值,在数据结构方面展示十分清晰;而ndarray只可以用下标去访问获取对应的值,常用于各类矩阵运算。

    • 3、DataFrame可以通过其中一组索引来生成Series,可以通过两组索引来获取value
      如:df.loc(index_name,column_name)df.iloc(index_id, column_id)df[column_name]

    • 4、SeriesDataFrame使用.values转成ndarray类型时,维度与原来的匹配,在使用机器学习的模型时是需要转换成二维形式,通常使用.values.reshape(-1,1)转成(m, n)形式,以便于在模型中进行运算。

三、Sklearn模块

全称是:scikit-learn,是免费的机器学习库,基于NumPy和SciPy。该部分主要介绍sklearn常用的模块。

  • (一)数据集
    常用:sklearn.datasets
    • 包含大量的数据集,在安装sklearn时就已经下载好许多csv、txt、mat等类型的数据。
      通常直接用 skelearn.datasets.load_数据集名() 导入。
    • 导入的数据集类型为Bunch类型,结构上看主要由dict和各类数据结构复合而成。
      可以使用加载的数据.keys()查看其包含的关键字
    • Bunch关键字一般包括:data, target, feature_names, DESCR, filename五个部分。

      data:所有数据集的特征,即输入空间的变量及其变量值。
      target:所有数据集的标签,即输出空间的变量及其变量值。
      feature_names:所有数据集的特征名称。
      DESCR:数据集的介绍,通常使用print(数据集.DESCR)来查看。
      filename:数据集的绝对路径。

  • (二)数据预处理
    常用:sklearn.preprocessing
    • 包含许多数据预处理的方法,特征编码、归一化、多项式映射等。
  • (三)样本划分
    常用:sklearn.model_selection
    • 包含许多模型性能评价、数据集分离器以及超参数优化功能。
      如:通常用model_selection.train_test_split() 来讲数据集划分成训练集和测试集。
  • (四)模型使用
    • sklearn包含大量的训练模型,线性、聚类、决策树、神经网络等。
      如:常用linear_model.LinearRegression 来做OLS回归

四、matplotlib模块

对于画图模块,比较常用的model有:matplotlibseabornmpl_toolkits,该部分简单介绍matplotlib的模块。

  • (一)跨平台字体库使用和管理
    matplotlib.font_manager.FontProperties() 使用本机的字体库,可以避免中文不显示问题。
  • (二)画图
    常用matplotlib.pyplot,一般会使用import matplotlib.pyplot as plt,简称其为plt
    • plt.subplots() 创建一个图窗口,包含多个子窗口
    • plt.xlabel() 设置x轴的标签名
    • plt.xlim() 设置x轴的极限(范围)
    • plt.title() 设置图标题
    • plt.show() 展示图像

五、IPython常用命令

对于IPython里面有许多功能挺常用的,通常分为magic line和magic cell。jupyter notebook使用的是IPython,通过交互功能来快速查看代码的执行情况。以下代码可以在note book中输入。

  • 1、%lsmagic:魔法命令查看,可以通过此命令来查看一些IPython内嵌的功能。
  • 2、%matplotlib inline:使用IPython内嵌的图像展示,通常在所有代码的首行写入
  • 3、%run:执行外部文件
  • 4、%%timeit:测试代码的运行时间
  • 5、%pwd :查看当前工作目录的路径
    • 除此之外可以使用os模块查看文件路径
    • os.path.abspath(file):查看file的绝对路径
    • os.path.normpath(file):读取文件名
  • 6、%conda:常用%conda install packages 安装第三方库
    • %conda install -n environment_name packages 是在指定的conda虚拟环境中安装包
  • 7、%pip:与!pip一致,基于默认解释器的环境安装对应的包,!表示cmd(终端)执行
    • !python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --user package
      --user 表示安装在本用户目录下,安装包到系统目录时需要root权限
      -i 表示使用非官方来源(一般是镜像)来安装包,上面的地址为清华镜像
      -m 对python执行时识别版本并匹配

六、Notebook常用操作

(一)模式

  • 1、编辑模式:<kbd>Enter</kbd>进入编辑模式,可以输入代码到单元格
  • 2、命令模式:<kbd>ESC</kbd> 进入命令模式,大多数快捷键在此模式下有效

(二)快捷键配置

  • 1、<kbd>H</kbd>:查看所有快捷键
  • 2、<kbd>P</kbd>:查看并修改(打开命令配置)
  • 3、<kbd>ctrl</kbd> + <kbd>shift</kbd> + <kbd>F/P</kbd> :查看并修改(打开命令配置)

(三)常用快捷键

  • 1、保存代码(命令模式下按s即可):<kbd>ctrl</kbd> + <kbd>s </kbd>
  • 2、单行执行并跳转到下一行(不限模式):<kbd>shift</kbd> + <kbd>Enter</kbd>
  • 3、单行执行不跳转(不限模式):<kbd>ctrl</kbd> + <kbd>Enter </kbd>
  • 4、上面/下面插入代码(命令模式):<kbd>A</kbd>/<kbd>B</kbd>
  • 5、缩进(编辑模式):<kbd>Tab</kbd> 或 <kbd>ctrl</kbd> + <kbd>]</kbd>
  • 6、取消缩进(编辑模式):<kbd>shift</kbd> + <kbd>Tab</kbd> 或 <kbd>ctrl</kbd> + <kbd>[ </kbd>
  • 7、注释(编辑模式):<kbd>ctrl </kbd>+ <kbd>/</kbd>
  • 8、撤销(编辑模式):<kbd>ctrl</kbd> + <kbd>z</kbd>
  • 9、重做(编辑模式):<kbd>ctrl</kbd> + <kbd>y </kbd>
  • 10、查看使用文档(编辑模式):输入光标移到对应代码 <kbd>shift</kbd> + <kbd>Tab</kbd>

七、绝对路径和相对路径

(一)绝对路径

  • 绝对路径是文件以盘符为开始的绝对位置。
  • 在Notebook中获取绝对路径,常用os模块。
    %pwd    # 魔法命令,获取当前文件路径
    os.path.getcwd()  # 获取当前文件的绝对路径
    os.path.abspath(file)   # 获取指定文件file的绝对路径
    

(二)相对路径

  • 相对路径是以当前文件位置为出发点,寻找到对应文件的地址。
    举个例子:

    工作文件的绝对路径是:D:/MachineLearning/LinearRegression/test01.py
    需要导入文件1的绝对路径是:D:/MachineLearning/LogisticRegression/test02.py
    需要导入文件2的绝对路径是:D:/DeepLearning/RandomForest/test03.py

    那么,从test01.py文件里导入test02.pytest03.py时,相对路径是:
    test02_path = r'../LogisticRegression/test02.py'
    test03_path = r'../../DeepLearning/RandomForest/test03.py'
    主要是地址(不包括文件名)的从右往左,不同部分开始输入../来返回上层,
    注意:但如果是跨盘输出,使用绝对路径。

八、系统变量与用户变量

常用于快速访问某个文件、执行某个程序或输出某个值,如:通常所说的添加到PATH

(一)Path变量

本质上是执行路径与执行顺序。

  • 1、执行命令时,在没有给定绝对路径的情况下,先在当前目录下寻找
  • 2、当前目录下没有对应文件,则优先从系统变量的Path寻找,若寻找到后则不再执行用户变量的PATH
  • 3、当在系统变量的Path没有找到时,则从用户变量中寻找,最后执行完没找到则返回NoSuchFile

(二)对于普通变量和path变量的区别

  • 1、用户变量的PATH会添加到Path后面,系统变量的Path优先度最高
  • 2、对于普通变量,用户变量的优先度要高于系统变量

九、参考资料

数据结构

1、https://zhuanlan.zhihu.com/p/83660582
2、https://blog.csdn.net/CPLwin/article/details/103820627
3、https://blog.csdn.net/wyl1813240346/article/details/79806207?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control

sklearn模块

4、https://scikit-learn.org/stable/modules/classes.html

matplotlib模块

5、https://matplotlib.org/stable/api/index.html

常用命令

6、https://www.zhihu.com/question/51467397/answer/1098115714

绝对路径与相对路径

7、https://blog.csdn.net/hgd613/article/details/8041662

系统变量与用户变量

8、https://blog.csdn.net/sj2050/article/details/114299599