sk-learn 使用点滴记录
去年刚使用sk-learn时,记录的笔记,移到博客中备忘。
1、数据的预处理:
scikit-learn使用任何存储为numpy数组或者scipy稀疏数组的数值数据。 其他可以转化成数值数组的类型也可以接受,如pandas中的DataFrame。
以下推荐一些将标准纵列形式的数据转换为scikit-learn可以使用的格式的方法:
pandas.io 提供了从常见格式(包括CSV,Excel,JSON,SQL等)中读取数据的工具.DateFrame 也可以从由 元组或者字典组成的列表构建而成.Pandas能顺利的处理异构的数据,并且提供了处理和转换 成方便scikit-learn使用的数值数据的工具。
scipy.io 专门处理科学计算领域经常使用的二进制格式,例如.mat和.arff格式的内容。
numpy/routines.io 将纵列形式的数据标准的加载为numpy数组
scikit-learn的 :func:`datasets.load_svmlight_file`处理svmlight或者libSVM稀疏矩阵
scikit-learn的 datasets.load_files 处理文本文件组成的目录,每个目录名是每个 类别的名称,每个目录内的每个文件对应该类别的一个样本
对于一些杂项数据,例如图像,视屏,音频。您可以参考:
skimage.io 或 Imageio 将图像或者视屏加载为numpy数组
scipy.misc.imread (requires the Pillow package)将各种图像文件格式加载为 像素灰度数据
scipy.io.wavfile.read 将WAV文件读入一个numpy数组
2、用于模型验证的交叉验证的三个常用函数介绍:
函数1:
sklearn.model_selection.
cross_val_score
(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
返回值是一个或一组指定形式的分数。
参数介绍:
(1)Estimator是估计器,即是选择的算法和模型,它可以通过pipeline这个类来加以修饰和监控,比如:
>>> from sklearn.pipeline import make_pipeline
>>> clf = make_pipeline(preprocessing.StandardScaler(), svm.SVC(C=1))
>>> cross_val_score(clf, iris.data, iris.target, cv=cv)
(2)、X、y这两个参数是用来训练和验证的输入和结果数据集,可以通过preprocessing预处理类对数据进行归一化、正规化、正则化等处理。
该sklearn.preprocessing模块包括缩放,定心,归一化,二值化和插补方法。
用户指南:有关详细信息,请参阅预处理数据部分。
举例:
>>> from sklearn import preprocessing
>>> X_train, X_test, y_train, y_test = train_test_split(
... iris.data, iris.target, test_size=0.4, random_state=0)
>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> X_train_transformed = scaler.transform(X_train)
>>> clf = svm.SVC(C=1).fit(X_train_transformed, y_train)
>>> X_test_transformed = scaler.transform(X_test)
>>> clf.score(X_test_transformed, y_test)
0.9333...
(3)、cv这个参数是交叉验证的方式,默认为Kfolder,即迭代地把数据集按一定数量(cv值)进行划分训练集合测试集,然后进行多次训练和验证,求分数;取平均值即为当前模型的预测效果。
通过另外的交叉验证迭代器可以改变交叉验证的方式,比如:
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = iris.data.shape[0]
>>> cv = ShuffleSplit(n_splits=3, test_size=0.3, random_state=0)
>>> cross_val_score(clf, iris.data, iris.target, cv=cv)
...
array([ 0.97..., 0.97..., 1. ])
另外,在这里提一下,交叉验证的方式有很多形式,有这种分割器:比如:
model_selection.KFold([n_splits, shuffle, ...]) |
K-折叠交叉验证器 |
model_selection.GroupKFold([n_splits]) |
具有非重叠组的K-fold迭代器变体 |
model_selection.StratifiedKFold([n_splits, ...]) |
分层K-折叠交叉验证器 |
离开一组交叉验证器 |
|
model_selection.LeavePGroupsOut(n_groups) |
离开P组交叉验证器 |
一次性交叉验证器 |
|
Leave-P-Out交叉验证器 |
|
model_selection.ShuffleSplit([n_splits, ...]) |
随机置换交叉验证器 |
随机组 - 交叉验证迭代器 |
|
分层ShuffleSplit交叉验证器 |
|
model_selection.PredefinedSplit(test_fold) |
预定义分裂交叉验证器 |
model_selection.TimeSeriesSplit([n_splits]) |
时间序列交叉验证器 |
有很多,他们的用法未见得都是设置cv这个参数,需要使用时具体学习。
(4)、scoring这个参数:即为规定输出结果形式的参数,根据不同的机器学习问题的类型,它需要选择衡量分数的标准也不同,在sklearn这个库中,主要集中在sklearn.metrics: Metrics(指标)这个类中,通过下表(表1)可以对常见问题的常见分值有个大致了解。
另外,得出分数后,并不一定能直观的看出当前模型的好坏,根据机器学习类型问题的不同,可能需要进一步量化式的分析,Metrics类结合其他一些类,会给出以下问题的常见衡量指标:分类指标、多标签排名指标、回归指标、聚类指标。
最后, 虚拟估计 可以用于获取随机预测的这些指标的基准值。
表1
函数2:
sklearn.model_selection.cross_validate
这个函数的用法用上面的cross_val_score的用法很类似,不过它的优点是返回的结果可以是一个字典dict,从而预测一组分数和数值,而不是一个衡量值。并且能看到fit_time和score_time。举例:
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,
... cv=5, return_train_score=False)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']
array([ 0.96..., 1. ..., 0.96..., 0.96..., 1. ])
其中,参数return_train_score默认为false,当它为True时,返回的字典中会有训练集的相关得分。
更进一步,返回的预测值可以是自己定义的,比如:
>>> from sklearn.metrics.scorer import make_scorer
>>> scoring = {'prec_macro': 'precision_macro',
... 'rec_micro': make_scorer(recall_score, average='macro')}
>>> scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,
... cv=5, return_train_score=True)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_prec_macro', 'test_rec_micro',
'train_prec_macro', 'train_rec_micro']
>>> scores['train_rec_micro']
array([ 0.97..., 0.97..., 0.99..., 0.98..., 0.98...])
函数3:
model_selection.cross_val_predict(estimator, X) |
为每个输入数据点生成交叉验证的估计 |
这个函数的接口形式与cross_val_score()的形式大致一致,不过它的返回值并不是一个分数,而是一个类似估计器的东西,然后将某种衡量指标和需要评估的结果集(Y)带入这个返回值,可以得到相应的分数,这个函数的特点貌似是可以使用整个用于本次机器学习的数据进行打分,即用来打分的数据量足够大,对于能够通过增加数据量来提高精确度的某些当前模型,这种形式更加精确。举例:
>>> from sklearn.model_selection import cross_val_predict
>>> predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)
>>> metrics.accuracy_score(iris.target, predicted)
0.973...