机器学习与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库的Series
、DataFrame
的关系。
(注意:Python除了list
外,还有tuple
、set
、dict
这些主要的数据结构同样需要了解。)
list
- 多个元素构成一个整体,但元素的数据类型不一定是相同的。
ndarray
-
一般来说,元素的数据类型设置dtypes为相同的,能进行广播、标量运算和矢量运算。
-
运行效率高和内存占用少,底层由C写的,内部解除GIL而不受Python解释器限制。
-
List
和ndarray
可以相互转换: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
。 -
List
、ndarray
和series
可以相互转换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'>
-
dict
与series
的相互转换与
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'>
-
ndarray
与series
的特殊转化,注意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按列合并成,可以通过column
和index
索引对应的value
。 list
、ndarray
、Series
、DataFrame
之间的转换
注意: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'>
dict
与DataFrame
的转换
输出的结果如下:# 第一种,传入单条数据,外层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'>
ndarray
、Series
和DataFrame
三者比较-
1、
Series
是一维的,即Series.ndim
为1;DataFrame
是二维的,即DataFrame.ndim
为2;而对于数组ndarray
可以是任意维度。 -
2、
Series
和DataFrame
都是带有索引,既可以用索引,也可以用下标去访问对应的值,在数据结构方面展示十分清晰;而ndarray
只可以用下标去访问获取对应的值,常用于各类矩阵运算。 -
3、
DataFrame
可以通过其中一组索引来生成Series
,可以通过两组索引来获取value
。
如:df.loc(index_name,column_name)
、df.iloc(index_id, column_id)
、df[column_name]
-
4、
Series
和DataFrame
使用.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时就已经下载好许多csv、txt、mat等类型的数据。
- (二)数据预处理
常用:sklearn.preprocessing
- 包含许多数据预处理的方法,特征编码、归一化、多项式映射等。
- (三)样本划分
常用:sklearn.model_selection
- 包含许多模型性能评价、数据集分离器以及超参数优化功能。
如:通常用model_selection.train_test_split()
来讲数据集划分成训练集和测试集。
- 包含许多模型性能评价、数据集分离器以及超参数优化功能。
- (四)模型使用
sklearn
包含大量的训练模型,线性、聚类、决策树、神经网络等。
如:常用linear_model.LinearRegression
来做OLS回归
四、matplotlib模块
对于画图模块,比较常用的model
有:matplotlib
、seaborn
、mpl_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.py
和test03.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