【机器学习】机器学习相关库及工具使用

Posted by ShawnD on January 10, 2020

scipy语法

import scipy.stats as st

st.norm.rvs(loc = 0,scale = 0.1,size =10)

norm.rvs通过loc和scale参数可以指定随机变量的偏移和缩放参数,这里对应的是正态分布的期望和标准差。size得到随机数数组的形状参数。

st.norm.pdf(x,loc = 0,scale = 1)

正态分布概率密度函数。

横轴为x, 纵轴为标准正态分布, 返回的值是纵轴坐标。

rvs

norm.rvs(loc=0, scale=1, size=1, random_state=None)

返回的是一个列表

不要认为norm.rvs(5)产生了五个变量, 它是产生了一个期望为5的随机变量。

sklearn语法

model_selection

train_test_split()

X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state,shuffle)

train_test_split()是sklearn.model_selection中的分离器函数,用于将数组或矩阵划分为训练集和测试集。

  • train_data:待划分的样本数据
  • train_target:待划分的对应样本数据的样本标签
  • test_size:1)浮点数,在0 ~ 1之间,表示样本占比(test_size = 0.3,则样本数据中有30%的数据作为测试数据,记入X_test,其余70%数据记入X_train,同时适用于样本标签);2)整数,表示样本数据中有多少数据记入X_test中,其余数据记入X_train
  • random_state:随机数种子,种子不同,每次采的样本不一样;种子相同,采的样本不变(random_state不取,采样数据不同,但random_state等于某个值,采样数据相同,取0的时候也相同,这可以自己编程尝试下,不过想改变数值也可以设置random_state = int(time.time()))
  • shuffle:洗牌模式,1)shuffle = False,不打乱样本数据顺序;2)shuffle = True,打乱样本数据顺序

linear_model

LogisticRegression

LogisticRegression.coef_

我们来回顾一下 Logistic 回归的模型:

\[h_{\theta}(x) = \frac{1}{1 + e^{(-\theta^T x)}}\]

$\theta^T x$可以写成$w^T x + b$, 令$b = w_0, x_0 = 1$, 就可以写成$\theta^T x$的形式。

所以clf.coef_和clf.intercept_就是$\theta$。

所以clf.coef_ 就是 $w$, clf.intercept_就是$b$?

model_selection

train_test_split

1
sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

将数组或矩阵拆分为随机训练和测试子集。

参数:

  • *arrays:具有相同长度/形状的可索引序列[0], 输入可以是lists,numpy arrays, scipy-sparse matrices 或者 pandas dataframes
  • test_size: float or int, default=None
  • train_size: float or int, default=None
  • random_state: int, RandomState instance or None, default=None
  • shuffle: bool, default=True。 是否重洗数据(洗牌),就是说在分割数据前,是否把数据打散重新排序这样子,看上面我们分割完的数据,都不是原始数据集的顺序,默认是要重洗的。
  • stratify: array-like, default=None。 这个要配合结果集使用,假设原始的结果集中有2种分类,A:B=1:2。我们在随机分配的时候,是无法保证训练集和测试集中的A与B的比例。 这时候,就可以用这个参数了,设置stratify=y,就可以让测试集和训练集中的结果集也保证这种分布

返回:

  • splitting: list, length=2 * len(arrays)。将输入拆分成训练、测试的结果。

RandomizedSearchCV

1
class sklearn.model_selection.RandomizedSearchCV(estimator, param_distributions, *, n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', random_state=None, error_score=nan, return_train_score=False)[source]

随机搜索超参数。

RandomizedSearchCV实现“fit”和“score”方法。 它也实现 “score_samples”, “predict”, “predict_proba”, “decision_function”, “transform” 和 “inverse_transform” 方法, 如果在使用的estimator实现了它们。

应用这些方法的estimator的参数通过 参数设置上 的 交叉验证搜索 来优化。

KFold

1
class sklearn.model_selection.KFold(n_splits=5, *, shuffle=False, random_state=None)

K-Folds cross-validator。

提供 train/test 索引以拆分 train/test 集中的数据。将数据集拆分为k个连续的folds(默认不打乱数据集)。

每个fold被用作validation一次, 其它 k-1 个 folds 用作训练集。

参数:

  • n_splits: int, default=5。 folds的数量,至少为2。Changed in version 0.22: n_splits default value changed from 3 to 5。
  • shuffle:bool, default=False。 在将数据拆分成batches之前, 是否将数据打乱。 请注意,每个拆分内的样本都不会被打乱。
  • random_state: int, RandomState instance or None, default=None。用于上面的shuffle的种子数。

Notes:

第一个 n_samples % n_splits folds 大小为 n_samples // n_splits + 1, 其他的folds的大小为 n_samples // n_splits, 其中 n_samples 是样本的数量。

Randomized CV splitters 可能会返回 split 每个调用的 不同结果。 你可以通过设置 random_state 为一个整数使得结果保持不变。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
...     print("TRAIN:", train_index, "TEST:", test_index)
...     X_train, X_test = X[train_index], X[test_index]
...     y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]

metrics

math

math.atan2

1
math.atan2(y, x)

atan2() 返回给定的 X 及 Y 坐标值的反正切值。

math.degrees

1
math.degrees(x)

degrees() 将弧度转换为角度。

d2l

d2l.stack

np.stack

1
numpy.stack(arrays, axis=0)

沿着axis轴连接数组的序列。

np.vstack

vstack 表示将数组在第一维进行堆叠(即最外层的方括号),可将 arr1 和 arr2 第一维内的部分视为一个整体

np.hstack

hstack 表示将数组在第二维进行堆叠(即第二层方括号),可将 arr 第二层括号里面的东西视为一个整体

np.dstack

dstack 表示将数组在第三维进行堆叠(即第三层方括号),可将 arr 第三层括号里面的东西视为一个整体

机器学习相关概念

K-fold 交叉验证

在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。

验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,又称循环验证。它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。

References

  1. sklearn.model_selection中train_test_split()函数
  2. sklearn 中 Logistics Regression 的 coef_ 和 intercept_ 的具体意义
  3. [深度概念]·K-Fold 交叉验证 (Cross-Validation)的理解与应用
  4. sklearn函数:train_test_split(分割训练集和测试集)