sklearn

2019-10-20  本文已影响0人  dingtom

中文手册
英文手册
在Sklearn当中有三大模型:Transformer 转换器、Estimator 估计器、Pipeline 管道

估计器 (estimator) 可以基于数据集对一些参数进行估计的对象都被称为估计器。
**预测器 (predictor) **在估计器上做了一个延展,延展出预测的功能。
**转换器 (transformer) **也是一种估计器,两者都带拟合功能,但估计器做完拟合来预测,而转换器做完拟合来转换。

估计器都有 fit() 方法,预测器都有 predict() 和 score() (返回的是分类准确率)方法,言外之意不是每个预测器都有 predict_proba() 和 decision_function() (返回的是每个样例在每个类下的分数值)方法

管道将Transformer、Estimator 组合起来成为一个大模型。
Transformer放在管道前几个模型中,而Estimator 只能放到管道的最后一个模型中。

多分类和多标签的 multiclass

多输出的 multioutput

选择模型的 model_selection

KFold交叉采样:将训练/测试数据集划分n_splits个互斥子集,每次只用其中一个子集当做测试集,剩下的(n_splits-1)作为训练集,进行n_splits次实验并得到n_splits个结果。
注:对于不能均等分的数据集,前n_samples%n_spllits子集拥有n_samples//n_spllits+1个样本,其余子集都只有n_samples//n_spllits个样本。(例10行数据分3份,只有一份可分4行,其他均为3行)

StratifiedKFold分层采样,用于交叉验证:与KFold最大的差异在于,StratifiedKFold方法是根据标签中不同类别占比1:1来进行拆分数据的。

流水线的 pipeline

1.监督学习

1.1. 线性模型

1.2. 线性和二次判别分析

1.3. 内核岭回归

1.4. 支持向量机

1.5. 随机梯度下降

1.6. 最近邻

1.7. 高斯过程

1.8. 交叉分解

1.9. 朴素贝叶斯

1.10. 决策树

1.11. 集成方法

1.12. 多类和多标签算法

1.13. 特征选择

1.14. 半监督学习

1.15. 等式回归

1.16. 概率校准

1.17. 神经网络模型(监督的)

2.无监督的学习

2.1. 高斯混合模型

2.2. 流形学习

2.3. 聚类

2.4. 双聚类

2.5. 分解组件中的信号(矩阵分解问题)

2.6. 协方差估计

2.7. 异常值检测

2.8. 密度估算

2.9. 神经网络模型(无监督)

3.模型选择和评估

3.1. 交叉验证:评估估算器性能

3.2. 调整估算器的超参数

sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)

方法:

属性:

3.3. 评分:量化预测的质量

准确率

from sklearn import metrics
metrics.accuracy_score(y_test, RF.predict(X_test))

3.4. 模型持久性

3.5. 验证曲线:绘制分数以评估模型

4.检查

4.1. 部分依赖图

4.2. 排列特征的重要性

5.可视化

5.1. 可用的绘图实用程序

6.数据集转换

6.1. Pipeline(管道)和 复合估计器

Pipeline
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

# evaluate baseline model with standardized dataset
numpy.random.seed(seed)
estimators = []
# 标准化的数据传到分类器
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, nb_epoch=100,
    batch_size=5, verbose=0)))
pipeline = Pipeline(estimators)
kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed)
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
print("Standardized: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

6.2. 特征提取

6.3. 预处理数据

onehot

OneHotEncoder(n_values=’auto’, categorical_features=’all’, dtype=<class ‘numpy.float64’>, sparse=True, handle_unknown=’error’)

n_values=’auto’表示每个特征使用几维的数值来表示。
categorical_features = 'all'指定了对哪些特征进行编码,默认对所有类别都进行编码。
dtype=<class ‘numpy.float64’> 表示编码数值格式,默认是浮点型。
sparse=True 表示编码的格式,默认为 True,即为稀疏的格式,指定 False 则就不用 toarray() 了
handle_unknown=’error’其值可以指定为 "error" 或者 "ignore",即如果碰到未知的类别,是返回一个错误还是忽略它。

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])
# 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,
# 也可以通过参数指定 sparse = False 来达到同样的效果
ans = enc.transform([[0, 1, 3]]).toarray()  
print(ans) 
# 输出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

把每一行当作一个样本,每一列当作一个特征

第一个特征有两个取值 0 或者 1,那么 one-hot 就会使用两位来表示这个特征,[1,0] 表示 0, [0,1] 表示 1,
第二列 [0,1,2,0],它有三种值,那么 one-hot 就会使用三位来表示这个特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,
第三列 [3,0,1,2],它有四种值,那么 one-hot 就会使用四位来表示这个特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3

enc = OneHotEncoder(n_values = [2, 3, 4])
enc.fit([[0, 0, 3],
         [1, 1, 0]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) # 输出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]

注意到训练样本中第二个特征列没有类别 2,但是结果中依然将类别 2 给编码了出来,这就是自己指定维数的作用了(我们使用 3 位来表示第二个特征,自然包括了类别 2),第三列特征同样如此。这也告诫我们,如果训练样本中有丢失的分类特征值,我们就必须显示地设置参数 n_values 了,这样防止编码出错。

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categorical_features = [0,2]) 
# 等价于 [True, False, True]
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) # 输出 [[ 1.  0.  0.  0.  0.  1.  2.]]

输出结果中前两位 [1,0] 表示 0,中间四位 [0,0,0,1] 表示对第三个特征 3 编码,第二个特征 2 没有进行编码,就放在最后一位。

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(sparse = False) 
ans = enc.fit_transform([[0, 0, 3],
                         [1, 1, 0],
                         [0, 2, 1],
                         [1, 0, 2]])

print(ans) 
# 输出 [[ 1.  0.  1. ...,  0.  0.  1.]
#      [ 0.  1.  0. ...,  0.  0.  0.]
#      [ 1.  0.  0. ...,  1.  0.  0.]
#      [ 0.  1.  1. ...,  0.  1.  0.]]
类别转换为数字
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
练集测试集划分

X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)

6.4. 缺失值的插补

6.5. 无监督降维

6.6. 随机投影

6.7. 内核近似

6.8. 成对度量,亲和力和内核

6.9. 转换预测目标(y)

7.数据集加载实用程序

打包好的数据:对于小数据集,用 sklearn.datasets.load_*

分流下载数据:对于大数据集,用 sklearn.datasets.fetch_*

随机创建数据:为了快速展示,用 sklearn.datasets.make_*

7.1. 通用数据集API

1.分类

手写数字数据集:

from sklearn.datasets import load_digits
digits = load_digits(n_class=5)  # 只加载0-4
print(digits.data.shape, digits.target.shape, digits.target_names)  

(901, 64) (901,) [0 1 2 3 4 5 6 7 8 9]

线鸢尾花数据集:

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data.shape, iris.target.shape, iris.feature_names, iris.target_names)  

(150, 4) (150,) ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] ['setosa' 'versicolor' 'virginica']

乳腺癌数据集:

from sklearn.datasets import load_breast_cancer
bc = load_breast_cancer()
print(bc.data.shape, bc.target.shape, bc.feature_names, bc.target_names)  

(569, 30) (569,) ['mean radius' 'mean texture' ...]['malignant' 'benign']

2.回归

糖尿病数据集:

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes.data.shape, diabetes.target.shape, diabetes.feature_names) 

(442, 10) (442,) ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'] Average blood pressure

波士顿房价数据集:

from sklearn.datasets import load_boston
boston = load_boston()
print(boston.data.shape, boston.target.shape, boston.feature_names)  

(506, 13) (506,) ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT']

3.多标签回归

体能训练数据集:

from sklearn.datasets import load_linnerud
linnerud = load_linnerud()
print(linnerud.data.shape, linnerud.target.shape, linnerud.target_names, linnerud.feature_names)  

(20, 3) (20, 3) ['Weight', 'Waist', 'Pulse'] ['Chins', 'Situps', 'Jumps']

7.2. 玩具数据集

7.3. 现实世界的数据集

7.4. 生成数据集

单标签

make_blobs:多类单标签数据集,为每个类分配一个或多个正太分布的点集,对于中心和各簇的标准偏差提供了更好的控制,可用于演示聚类

make_classification:多类单标签数据集,为每个类分配一个或多个正太分布的点集,引入相关的,冗余的和未知的噪音特征;将高斯集群的每类复杂化;在特征空间上进行线性变换

make_gaussian_quantiles:将single Gaussian cluster (单高斯簇)分成近乎相等大小的同心超球面分离。

make_hastie_10_2:产生类似的二进制、10维问题。

make_moons/make_moons:生成二维分类数据集时可以帮助确定算法(如质心聚类或线性分类),包括可以选择性加入高斯噪声。它们有利于可视化。用球面决策边界对高斯数据生成二值分类。

多标签

make_multilabel_classification:生成多个标签的随机样本。

二分聚类

make_biclusters:Generate an array with constant block diagonal structure for biclustering。

make_checkerboard:Generate an array with block checkerboard structure for biclustering。

回归生成器

make_regression:产生的回归目标作为一个可选择的稀疏线性组合的具有噪声的随机的特征。它的信息特征可能是不相关的或低秩(少数特征占大多数的方差)。

make_sparse_uncorrelated: 产生目标为一个有四个固定系数的线性组合。

make_friedman1: 与多项式和正弦相关变换相联系。

make_friedman2: 包括特征相乘与交互。

make_friedman3: 类似与对目标的反正切变换。

7.5. 加载其他数据集

8.使用scikit-learn

8.1计算. 计算扩展的策略:更大的数据

8.2. 计算性能

8.3. 并行性,资源管理和配置

上一篇 下一篇

猜你喜欢

热点阅读