python机器学习笔记

2018-12-04  本文已影响0人  jinx丶

lambda表达式

通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数

add = lambda x, y : x + y
add(1,2)  # 结果为3

pct_change()函数

这个函数用来计算同column两个相邻的数字之间的变化率,适用于Series、DataFrame、Panel,使用前需要先填空或者删除NAN

corrwith函数

corrwith(Series | list, axis=0):axis=0时计算frame的每列和参数的相关系数

numpy.tile()函数

就是把数组沿各个方向复制
比如 a = np.array([0,1,2]),np.tile(a,(2,1))就是把a先沿x轴(就这样称呼吧)复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍,即最终得到
array([[0,1,2],
[0,1,2]])

>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2) #沿X轴复制2倍
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
>>> np.tile(b, (2, 1)) #沿X轴复制1倍(相当于没有复制),再沿Y轴复制2倍
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])

python幂指数运算

>>> 2.0 * * 3
8.0

dataframe按照条件选行

在使用dataframe处理数据的时候碰到了按照条件选取行的问题,单个条件时可以使用:

df[df['one'] > 5]

如果多个条件的话需要这么写:

import numpy as np
df[np.logical_and(df['one']> 5, df['two']>5)]

也可以这么写

df[(df['one']> 5) & (df['two']>5)]

random_state函数

from sklearn import model_selection
x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2, random_state=0)

这里的random_state就是为了保证程序每次运行都分割一样的训练集合测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。
当你用sklearn分割完测试集和训练集,确定模型和促初始参数以后,你会发现程序每运行一次,都会得到不同的准确率,无法调参。这个时候就是因为没有加random_state。加上以后就可以调参了。

fit_transform与transform的区别

fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
tranform()的作用是通过找中心和缩放等实现标准化
transform函数是一定可以替换为fit_transform函数的
fit_transform函数不能替换为transform函数
为了数据归一化(使特征数据方差为1,均值为0),我们需要计算特征数据的均值μ和方差σ^2,再使用下面的公式进行归一化:



我们在训练集上调用fit_transform(),其实找到了均值μ和方差σ^2,即我们已经找到了转换规则,我们把这个规则利用在训练集上,同样,我们可以直接将其运用到测试集上(甚至交叉验证集),所以在测试集上的处理,我们只需要标准化数据而不需要再次拟合数据。

train_test_split函数示例

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> list(y)
[0, 1, 2, 3, 4]
>>> X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=42)
>>> X_train
array([[4, 5],
       [0, 1],
       [6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
       [8, 9]])
>>> y_test
[1, 4]

DataFrame.to_dict(orient='dict')

将DataFrame格式的数据转化成字典形式
参数:当然参数orient可以是字符串{'dict', 'list', 'series', 'split', 'records', 'index'}中的任意一种来决定字典中值的类型
字典dict(默认):类似于{列:{索引:值}}这样格式的字典
列表list:类似于{列:[值]}这种形式的字典
序列series:类似于{列:序列(值)}这种形式的字典
分解split:类似于{索引:[索引],列:[列],数据:[值]}这种形式的字典
记录records:类似于[{列:值},...,{列:值}]这种形式的列表
索引index:类似于{索引:{列:值}}这种形式的字典
在新版本0.17.0中,允许缩写,s表示序列,sp表示分裂
返回:结果:像{列:{索引:值}}这种形式的字典

numpy.logspace用法

  1. 先来看一个例子,我们让开始点为0,结束点为0,元素个数为10,看看输出结果。为什么是这样子?难道不都是0吗?
>>> a = np.logspace(0,0,10)
>>> a
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
  1. 因为logspace中,开始点和结束点是10的幂,0代表10的0次方,9代表10的9次方。我们看下面的例子。
>>> a = np.logspace(0,9,10)
>>> a
array([  1.00000000e+00,   1.00000000e+01,   1.00000000e+02,
         1.00000000e+03,   1.00000000e+04,   1.00000000e+05,
         1.00000000e+06,   1.00000000e+07,   1.00000000e+08,
         1.00000000e+09])
  1. 假如,我们想要改变基数,不让它以10为底数,我们可以改变base参数,将其设置为2试试。
>>> a = np.logspace(0,9,10,base=2)
>>> a
array([   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.,  512.])

sklearn.pipeline

有很多数据转换步骤需要按照正确的步骤执行,sklearn提供了Pipeline类来处理这种顺序的操作步骤

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
num_pipeline = Pipeline([
    ('imputer', Imputer(strategy="median")),
    ('attribs_adder', CombinedAttributesAdder()),
    ('std_scaler', StandardScaler()),
])
housing_num_tr = num_pipeline.fit_transform(housing_num)

Pipeline构造器接受(name, transform) tuple的列表作为参数,按顺序执行列表中的transform
所以 上述代码的处理步骤:
先在housing_num中利用Imputer处理缺失值,然后将返回值传给CombinedAttributesAdder,添加一些特征属性,接下来再将返回值传给StandardScaler,完成标准化,完成数据预处理。

DictVectorizer-特征提升之特征抽取

DictVectorizer的处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等,将符号转成数字0/1表示

#定义一组字典列表,用来表示多个数据样本(每个字典代表一个数据样本)
measurements = [{'city':'Beijing','temperature':33.},{'city':'London','temperature':12.},{'city':'San Fransisco','temperature':18.}]
#从sklearn.feature_extraction导入DictVectorizer
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
#输出转化后的特征矩阵
print vec.fit_transform(measurements).toarray()
#输出各个维度的特征含义
print vec.get_feature_names()

输出结果为:

[[  1.   0.   0.  33.]
 [  0.   1.   0.  12.]
 [  0.   0.   1.  18.]]
 ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']

我们不难发现,DictVectorizer对非数字化的处理方式是,借助原特征的名称,组合成新的特征,并采用0/1的方式进行量化,而数值型的特征转化比较方便,一般情况维持原值即可。
接下来进一步验证这个结论,决定在每个原来的字典结构中,再增加一个符号化特征,”country”

#定义一组字典列表,用来表示多个数据样本(每个字典代表一个数据样本)
measurements = [{'city':'Beijing','country':'CN','temperature':33.},{'city':'London','country':'UK','temperature':12.},{'city':'San Fransisco','country':'USA','temperature':18.}]
#从sklearn.feature_extraction导入DictVectorizer
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
#输出转化后的特征矩阵
print vec.fit_transform(measurements).toarray()
#输出各个维度的特征含义
print vec.get_feature_names()

输出结果为:

[[  1.   0.   0.   1.   0.   0.  33.]
 [  0.   1.   0.   0.   1.   0.  12.]
 [  0.   0.   1.   0.   0.   1.  18.]]
 ['city=Dubai', 'city=London', 'city=San Fransisco', 'country=CN', 'country=UK', 'country=USA', 'temperature']

设置matplotlib图片大小

plt.figure(figsize=(6, 6.5))

git clone

如:git clone https://github.com/wesm/pydata-book.git
快速下载github文件

上一篇 下一篇

猜你喜欢

热点阅读