机器学习-学习笔记

一个Windows操作系统能够使用的pythonIDE

winPython下载地址:WinPython_2.7

传统的F-measure或平衡的F-score (F1 score)是精度和召回的调和平均值:

F1=2precision?recallprecision+recall

1.Cross Validation (交叉验证)

cross validation大概的意思是:对于原始数据我们要将其一部分分为train_data,一部分分为test_data。train_data用于训练,test_data用于测试准确率。在test_data上测试的结果叫做validation_error。将一个算法作用于一个原始数据,我们不可能只做出随机的划分一次train和test_data,然后得到一个validation_error,就作为衡量这个算法好坏的标准。因为这样存在偶然性。我们必须好多次的随机的划分train_data和test_data,分别在其上面算出各自的validation_error。这样就有一组validation_error,根据这一组validation_error,就可以较好的准确的衡量算法的好坏。

cross validation是在数据量有限的情况下的非常好的一个evaluate performance的方法。而对原始数据划分出train data和test data的方法有很多种,这也就造成了cross validation的方法有很多种。

sklearn中的cross validation模块,最主要的函数是如下函数:

sklearn.cross_validation.cross_val_score:他的调用形式是scores = cross_validation.cross_val_score(clf, raw_data, raw_target, cv=5, score_func=None)

参数解释:

clf:表示的是不同的分类器,可以是任何的分类器。比如支持向量机分类器。clf = svm.SVC(kernel=’linear’, C=1);

raw_data:原始数据;

raw_target:原始类别标号;

cv:代表的就是不同的cross validation的方法了。引用scikit-learn上的一句话(When the cv argument is an integer, cross_val_score uses the KFold or StratifiedKFold strategies by default, the latter being used if the estimator derives from ClassifierMixin.)如果cv是一个int数字的话,那么默认使用的是KFold或者StratifiedKFold交叉,如果如果指定了类别标签则使用的是StratifiedKFold。

cross_val_score:这个函数的返回值就是对于每次不同的的划分raw_data时,在test_data上得到的分类的准确率。至于准确率的算法可以通过score_func参数指定,如果不指定的话,是用clf默认自带的准确率算法。

scikit-learn的cross-validation交叉验证代码:

>>> from sklearn import cross_validation
>>> from sklearn import svm
>>> clf = svm.SVC(kernel=‘linear‘, C=1)
>>> scores = cross_validation.cross_val_score(clf, iris.data, iris.target, cv=5)#5-fold cv
# change metrics
>>> from sklearn import metrics
>>> cross_validation.cross_val_score(clf, iris.data, iris.target, cv=5, score_func=metrics.f1_score)
#f1 score: http://en.wikipedia.org/wiki/F1_score

Note: if using LR, clf = LogisticRegression().

生成一个数据集做为交叉验证

>>> import numpy as np
>>> from sklearn.cross_validation 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]

交叉验证的使用

下面是手动划分训练集和测试集,控制台中输入下列代码进行测试:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
>>> clf = svm.SVC(kernel=‘linear‘, C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...

下面是交叉验证的实例:

>>> clf = svm.SVC(kernel=‘linear‘, C=1)
>>> scores = cross_validation.cross_val_score(
...    clf, iris.data, iris.target, cv=5)
...
>>> scores
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

通过cross_validation,设置cv=5,进行5倍交叉验证,最后得到一个scores的预测准确率数组,表示每次交叉验证得到的准确率。

>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

通过scores.mean()求出平均值,得到平均精度。还可以通过指定scoring来设置准确率算法

>>> from sklearn import metrics
>>> scores = cross_validation.cross_val_score(clf, iris.data, iris.target,
...     cv=5, scoring=‘f1_weighted‘)
>>> scores
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

libsvm格式的数据导入:

>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...
>>>X_train.todense()#将稀疏矩阵转化为完整特征矩阵

2.处理非均衡问题

对于正负样本比例相差较大的非均衡问题,一种调节分类器的方法就是对分类器的训练数据进行改造。一种是欠抽样,一种是过抽样。过抽样意味着赋值样例,而欠抽样意味着删除样例。对于过抽样,最后可能导致过拟合问题;而对于欠抽样,则删掉的样本中可能包含某些重要的信息,会导致欠拟合。对于正例样本较少的情况下,通常采取的方式是使用反例类别的欠抽样和正例类别的过抽样相混合的方法


3.scikit-learn学习SVM

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
>>> print digits.data
[[  0.   0.   5. ...,   0.   0.   0.]
 [  0.   0.   0. ...,  10.   0.   0.]
 [  0.   0.   0. ...,  16.   9.   0.]
 ...,
 [  0.   0.   1. ...,   6.   0.   0.]
 [  0.   0.   2. ...,  12.   0.   0.]
 [  0.   0.  10. ...,  12.   1.   0.]]
>>> digits.target
array([0, 1, 2, ..., 8, 9, 8])
>>> digits.images[0]
array([[  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.],
       [  0.,   0.,  13.,  15.,  10.,  15.,   5.,   0.],
       [  0.,   3.,  15.,   2.,   0.,  11.,   8.,   0.],
       [  0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.],
       [  0.,   5.,   8.,   0.,   0.,   9.,   8.,   0.],
       [  0.,   4.,  11.,   0.,   1.,  12.,   7.,   0.],
       [  0.,   2.,  14.,   5.,  10.,  12.,   0.,   0.],
       [  0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.]])
>>> from sklearn import svm
>>> clf = svm.SVC(gamma=0.001, C=100.)
>>> clf.fit(digits.data[:-1],digits.target[:-1])
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
  gamma=0.001, kernel=‘rbf‘, max_iter=-1, probability=False,
  random_state=None, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict(digits.data[-1])
array([8])
>>> 

3.scikit-learn学习RandomForest

使用例子

>>> from sklearn.ensemble import RandomForestClassifier
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = RandomForestClassifier(n_estimators=10)
>>> clf = clf.fit(X, Y)

Method

randomForestClassifier分类器的初始值

def __init__(self,
     n_estimators=10,
     criterion="gini",
     max_depth=None,
     min_samples_split=2,
     min_samples_leaf=1,
     min_weight_fraction_leaf=0.,
     max_features="auto",
     max_leaf_nodes=None,
     bootstrap=True,
     oob_score=False,
     n_jobs=1,
     random_state=None,
     verbose=0,
     warm_start=False,
     class_weight=None):


本栏目Machine Learning持续更新中,欢迎关注:Dream_Angel_Z博客

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 15:47:15

机器学习-学习笔记的相关文章

机器学习学习笔记1

机器学习学习笔记1 周志华 机器学习 Flyu6 Time: 2016-6-12 基本概念的学习 Learning Style(学习类型) supervised(监督学习) unsupervised(非监督学习) 假设空间 归纳 (induction) 演绎 (deduction) 归纳偏好 没有免费午餐(NFL: No Free Lunch Theorem) 基本概念的学习 Learning Style(学习类型) supervised(监督学习) 监督学习 所谓的监督学习其实就是在数据集D中

吴恩达“机器学习”——学习笔记五

朴素贝叶斯算法(Naive Bayes)(续学习笔记四) 两个朴素贝叶斯的变化版本 x_i可以取多个值,即p(x_i|y)是符合多项式分布的,不是符合伯努利分布的.其他的与符合伯努利的情况一样.(同时也提供一种思路将连续型变量变成离散型的,比如说房间的面积可以进行离散分类,然后运用这个朴素贝叶斯算法的变形). 第二个朴素贝叶斯的变化形式专门用来处理文本文档,即对序列进行分类,被称为朴素贝叶斯的事件模型(event model).这将使用一种不同的方式将邮件转化为特征向量. 之前的特征向量是:向量

机器学习学习笔记-绪论

根据训练数据是否拥有标记信息,学习任务可大致划分为两大类:"监督学习"和"无监督学习",分类和回归是前者的代表,聚类是后者的代表. 预测的若是离散值,学习任务则成为"分类",涉及两个类别的是"二分类",涉及多个类别的是"多分类": 预测任务对象若是连续值,此类学习任务成为"回归": 聚类,是根据训练集的数据内在规律进行划分,不依赖标记信息. 归纳与演绎--科学推理的两大基本手段. 演绎:

“机器学习” 学习笔记

看了 Andrew Ng 公开课里的第一节课后,感觉机器学习好高大上..系里最高大上的国家级重点实验室CAD实验室用的3D成像技术就跟Andrew Ng大大放的聚类算法做出的3D场景几乎一样.看完后我觉得,我现在也开始走高端路线了→_→ 第一章:回归算法 1.LMS Algorithm (待续...)

吴恩达“机器学习”——学习笔记二

定义一些名词 欠拟合(underfitting):数据中的某些成分未被捕获到,比如拟合结果是二次函数,结果才只拟合出了一次函数. 过拟合(overfitting):使用过量的特征集合,使模型过于复杂. 参数学习算法(parametric learning algorithms):用固定的参数进行数据的拟合.比如线性回归. 非参数学习算法(non-parametric learning algorithms):使用的参数随着训练样本的增多而增多. 局部加权回归(locally weighted r

吴恩达“机器学习”——学习笔记四

生成学习算法 判别算法:进行P(y|x)的计算或者是进行h(x)(其中h只会是0与1)的计算. 生成学习算法:进行P(x|y)的建模,即给定类的条件下,某种特征显示的结果.同时也会对P(y)进行建模. 根据贝叶斯公式,我们可以得到,其中p(x) = p(x|y = 1)p(y = 1) + p(x|y = 0)p(y = 0).实际上,如果我们计算P(y|x)进行预测,我们不必计算分母的值,因为x是独立于y的,所以argmax是当式子取到最大值时,对应参数的取值. 高斯判别分析 多元高斯分布 如

机器学习-学习笔记3.1-局部加权回归

局部加权紧接着上面的线性回归中参数求解来继续讲吧.还是以上面的房屋价格的预测,它的中心思想是在对参数进行求解的过程中,每个样本对当前参数值的影响是有不一样的权重的.比如上节中我们的回归方程为(这个地方用矩阵的方法来表示?表示参数,i表示第i个样本,h为在?参数下的预测值): 我们的目标是让 最小,然后求出来?,再代入h中就可以得到回归方程了. 但是如果类似以下的样本,他们的对应图如下: 如果用之前的方法,图中线为求出的回归方程,那么在x的取值和真实差别很大,这个情况叫做欠拟合.那么我们怎么办呢?

机器学习学习笔记 PRML Chapter 2.0 : Prerequisite 2 -Singular Value Decomposition (SVD)

Chapter 2.0 : Prerequisite 2 -Singular Value Decomposition (SVD) Chapter 2.0 : Prerequisite 2 -Singular Value Decomposition (SVD) Christopher M. Bishop, PRML, Chapter 2 Probability Distributions 1. Vector Terminology Orthogonality Two vectors and are

机器学习-李航-统计学习方法学习笔记之感知机(2)

在机器学习-李航-统计学习方法学习笔记之感知机(1)中我们已经知道感知机的建模和其几何意义.相关推导也做了明确的推导.有了数学建模.我们要对模型进行计算. 感知机学习的目的是求的是一个能将正实例和负实例完全分开的分离超平面.也就是去求感知机模型中的参数w和b.学习策略也就是求解途径就是定义个经验损失函数,并将损失函数极小化.我们这儿采用的学习策略是求所有误分类点到超平面S的总距离.假设超平面s的误分类点集合为M,那么所有误分类点到超平面S的总距离为 显然损失函数L(w,b)是非负的,如果没有误分