如何使用机器学习神器sklearn做特征工程?
使用 sklearn 做特征工程
特征工程是什么?
本文中使用 sklearn 中的 IRIS(鸢尾花)数据集[1]来对特征处理功能进行说明。IRIS 数据集由 Fisher 在 1936 年整理,包含 4 个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入 IRIS 数据集的代码如下:
from sklearn.datasets import load_iris #导入IRIS数据集 iris = load_iris() #特征矩阵 iris.data #目标向量 iris.target
数据预处理
我们使用 sklearn 中的 preproccessing 库来进行数据预处理,可以覆盖以上问题的解决方案。
2.1 无量纲化
无量纲化使不同规格的数据转换到同一规格 ...
系统
Python 中与文件路径有关的模块是 os 模块
路径获取
取得当前工作目录:os.getcwd()
取得绝对路径:os.path.abspath(str)#str 表示文件名
取得相对路径:os.path.relpath(path,start)#传回从 start 到 path 的相对路径,省略则会传回当前工作目录到 path 的相对路径
路径检查
exist(path):检查 path 是否存在
isabs(path):检查是否是绝对路径
isdir(path):检查是否是文件夹
isfile(path):检查是否是文件
针对文件的操作
mkdir(path):建立 path 文件夹
rmdir(path):删除 path 文件夹,但必须是空的文件夹
remove(path):删除 path 文件
chdir(path):将当前工作文件夹改至 path。
#在D盘创建文件夹,在文件夹内创建若干个文件from genericpath import existsimport osfrom time import sleepfile_path="D:\\file_ ...
数据可视化入门
数据可视化的主要方法是借助 matplotlib 或者 Seaborn。除了这些以外,通过类似于Bokeh或者Plotly工具我们已经可以借助用浏览器创建动态可交互的图像(基于 python)。
内容简介
大部分可视化库都是利用[图形框架语法]来构建图像,可以自己定义轴,线,框这些元素,保证了高度的自由度。
五个比较关键的库:
更多细节的对比:
学习路线
matplotlib:matplotlib 的自定义化程度高,语法相对比较复杂,不作为主力可视化方法(学习成本相对较高),不过底层逻辑的一些东西要清楚,大部分可视化的库都是建立在这个库的基础之上,具体的绘图函数之类的东西不必太过认真看,有些内容调节起来过于繁琐。
Seaborn: seaborn 的语法比较简单,图形本身比较美观易用,这个库的学习主要借助官方文档,明白 seaborn 的可视化上限和自定义程度即可。
creating interactive graphics
Plotly
相关说明:
plotly 是一个基于 javascript 的绘图库,plotly 绘图种类丰富,效果美观;
易于保存与分享 plotly ...
Entroy
点击查看【bilibili】
1 章 绪论.pdf
2 章 离散信源及其信息测度.pdf
intro
熵可以从随机变量状态需要的平均信息量角度理解, 也可以从描述统计力学中无序程度的度量角度理解。从平均信息量的角度来看,对于不确定性事件,可以用消除其不确定性需要的信息量(bit 数)来表示,这里表示成−logpi-\log p_i−logpi,而考虑到随机事件的不确定性,可以通过对信息量求期望得到某随机事件(随机变量)的信息熵,信息熵越大,则说明(消除随机性)需要的信息量越大,即不确定性越大。
一般来说,对于随机变量XXX,其信息熵定义如下:
H(X)=−∑i=1np(xi)log2p(xi)H(X)=-\sum\limits_{i=1}^{n}p(x_i)\log_2{p(x_i)}
H(X)=−i=1∑np(xi)log2p(xi)
if p=0p=0p=0,then plog2p=0p\log_2{p}=0plog2p=0
H(X)H(X)H(X)越小,XXX的纯度越高。非均匀分布比均匀分布熵要小。
熵衡量的是不确定性,概率描述的是确定性,其实确定性和不确定性 ...
re
有了准备知识,我们就可以在 Python 中使用正则表达式了。Python 提供re模块,包含所有正则表达式的功能。
re.compile(pattern, flags=0): 将字符串形式的正则表达式编译为 Pattern对象。有的时候进行复杂的匹配,可以通过先对模式进行编译来加快匹配速度
re.finditer(string, pos, endpos): 从string任意位置开始匹配, 返回一个迭代器。 一般匹配findall就可以了, 大数量的匹配还是使用finditer比较好。
由于 Python 的字符串本身也用\转义,所以要特别注意:
s = 'ABC\\-001'
因此我们强烈建议使用 Python 的**r**前缀,就不用考虑转义的问题了:
s = r'ABC\-001'
首次匹配:match and search()
re.match(string, pos, endpos): 从string的开头开始匹配。
re.search(string, pos, endpos): 从string的任意位置开始匹配,默认返回第一 ...
学习策略
主要来对比几种不同风险损失函数之间的区别,对机器学习策略有一个更加深入的了解。
周志华老师在讲解Adaboost这章时提到过指数损失函数和0/1损失函数是一致的替代损失函数,二者均达到了贝叶斯最优错误率。
对偶问题(SVM)
Duality (optimization)
In mathematical optimization theory, duality or the duality principle is the principle that optimization problems may be viewed from either of two perspectives, the primal problem or the dual problem. The solution to the dual problem provides a lower bound to the solution of the primal (minimization) problem.However in general the optimal values of the primal and dual problems need not be equal. Their difference is called the duality gap. For convex optimization problems, ...
Ipython
IPython 是一种基于 python 的交互式解释器,提供了强大的编辑和交互能力。
对于对象功能的查询操作,Ipython 提供了两种方法:
object?:返回变量的详细信息,查询变量类型或者函数帮助
object??:与上一个功能相似,还可以查看函数或者模块对象的源代码
Ipython 中有一种魔术命令,相当于提供了一种简便进行交互的方式。魔术命令分为两种:
以%开头,是作用于行的魔术命令
%pdoc 打印对象的文档字符串
%quickref#查看语法和魔法命令
%magic:获取所有魔法命令及其用法
%timeit#测量语句的执行时间
%run test.py #运行 python 程序(脚本)
%load test.py #导入文件
%paste #从剪切板运行代码
%cpaste #防止粘贴错误,允许查看并运行
%save path n1,n2,n3:保存指定的 cell
%bookmark:将常用目录保存为别名,方便使用
以%%开头,表示在整个 cell 单元起作用
%%timeit#测量 cell 的执行时间
%%latex:latex 渲染
%%mar ...
最大熵模型
信息熵在PRML中的表达
下面看下信息熵在PRML中的表达
假设一个发送者想传输一个随机变量xxx的值给接受者. 在这个过程中, 他们传输的平均信息量可以通过求信息h(x)h(x)h(x)关于概率分布p(x)p(x)p(x)的期望得到.
这个重要的量叫做随机变量xxx的熵
datetime模块
字符串和 Datetime 之间的转换
对于 datetime 模块的所有与时间点相关的对象:
这些对象转化成字符串只需要利用 str 函数(格式化)
也可以利用对象的 strftime()方法,该方法需要传入参数来指定格式化的形式,规范遵循 ISO C89 compatible(详见 time 模块的时间对象格式化方法)。
通过字符串得到这些对象一般要借助对应类的方法 strptime,这个方法需要传入两个参数,一个参数是要解析的字符串,一个参数是规定了字符串的格式。datetime.strptime('2022-02-10','%Y-%m-%d')需要注意的是两个参数的形式必须完全一致否则会解析错误。
考虑到 strptime()方法不适用于格式不相同的字符串转化为时间对象,这里可以使用dateutil.parser.parse()函数对一些常见的时间字符串进行自动解析(这个库会在安装 pd 时自动安装),另外也可以调节参数对解析方式微调
from dateutil.parser import parseparse('2011-01-03')pars ...