scikit-learn使用笔记与sign prediction简单小结
经edwin chen的推荐,认识了scikit-learn这个非常强大的python机器学习工具包。这个帖子作为笔记。(其实都没有笔记的意义,因为他家文档做的太好了,不过还是为自己记记吧,为以后节省若干分钟)。如果有幸此文被想用scikit-learn的你看见,也还是非常希望你去它们的主页看文档。主页中最值得关注的几个部分:user guide几乎是machine learning的索引,各种方法如何使用都有,reference是各个类的用法索引。
s1. 导入数据
大多数数据的格式都是m个n维向量,分为训练集和测试集。所以,知道如何导入向量(矩阵)数据是最为关键的一点。这里要用到numpy来协助。假设数据格式是:
stock prices indicator1 indicator2
2.0 123 1252
1.0 .. ..
.. . .
.
导入代码参考:
import numpy as np
f = open("filename.txt")
f.readline() # skip the header
data = np.loadtxt(f)
x = data[:, 1:] # select columns 1 through end
y = data[:, 0] # select column 0, the stock price
libsvm格式的数据导入:
>>> from sklearn.datasets import load_svmlight_file
>>> x_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...
>>>x_train.todense()#将稀疏矩阵转化为完整特征矩阵
更多格式数据导入与生成参考:
s2. supervised classification 几种常用方法:
logistic regression
>>> from sklearn.linear_model import logisticregression
>>> clf2 = logisticregression().fit(x, y)
>>> clf2
logisticregression(c=1.0, intercept_scaling=1, dual=false, fit_intercept=true,
penalty='l2', tol=0.0001)
>>> clf2.predict_proba(x_new)
array([[ 9.07512928e-01, 9.24770379e-02, 1.00343962e-05]])
linear svm (linear kernel)
>>> from sklearn.svm import linearsvc
>>> clf = linearsvc()
>>> clf.fit(x, y)
>>> x_new = [[ 5.0, 3.6, 1.3, 0.25]]
>>> clf.predict(x_new)#reuslt[0] if class label
array([0], dtype=int32)
svm (rbf or other kernel)
>>> from sklearn import svm
>>> clf = svm.svc()
>>> clf.fit(x, y)
svc(c=1.0, cache_size=200, class_weight=none, coef0=0.0, degree=3,
gamma=0.0, kernel='rbf', probability=false, shrinking=true, tol=0.001,
verbose=false)
>>> clf.predict([[2., 2.]])
array([ 1.])
naive bayes (gaussian likelihood)
from sklearn.naive_bayes import gaussiannb
>>> from sklearn import datasets
>>> gnb = gaussiannb()
>>> gnb = gnb.fit(x, y)
>>> gnb.predict(xx)#result[0] is the most likely class label
decision tree (classification not regression)
>>> from sklearn import tree
>>> clf = tree.decisiontreeclassifier()
>>> clf = clf.fit(x, y)
>>> clf.predict([[2., 2.]])
array([ 1.])
ensemble (random forests, classification not regression)
>>> from sklearn.ensemble import randomforestclassifier
>>> clf = randomforestclassifier(n_estimators=10)
>>> clf = clf.fit(x, y)
>>> clf.predict(x_test)
s3. model selection (cross-validation)
手工分training data和testing data当然可以了,但是更方便的方法是自动进行,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: <a href="http://en.wikipedia.org/wiki/f1_score">http://en.wikipedia.org/wiki/f1_score</a>
more about cross-validation:
note: if using lr, clf = logisticregression().
s4. sign prediction experiment
数据集,epinions,有user与user之间的trust与distrust关系,以及interaction(对用户评论的有用程度打分)。
features:网络拓扑feature参考"predict positive and negative links in online social network",用户交互信息feature。
一共设了3类instances,每类3次训练+测试,训练数据是测试数据的10倍,~80,000个29/5/34维向量,得出下面一些结论。时间上,gnb最快(所有instance都是2~3秒跑完),dt非常快(有一类instance只用了1秒,其他都要4秒),lr很快(三类instance的时间分别是2秒,5秒,~30秒),rf也不慢(一个instance9秒,其他26秒),linear kernel的svm要比lr慢好几倍(所有instance要跑30多秒),rbf kernel的svm比linear svm要慢20+倍到上百倍(第一个instance要11分钟,第二个instance跑了近两个小时)。准确度上rf>lr>dt>gnb>svm(rbf kernel)>svm(linear kernel)。gnb和svm(linear kernel)、svm(rbf kernel)在第二类instance上差的比较远(10~20个百分点),lr、dt都差不多,rf确实体现了ensemble方法的强大,比lr有较为显著的提升(近2~4个百分点)。(注:由于到该文提交为止,rbf版的svm才跑完一次测试中的两个instance,上面结果仅基于此。另外,我还尝试了sgd等方法,总体上都不是特别理想,就不记了)。在feature的有效性上面,用户交互feature比网络拓扑feature更加有效百分五到百分十。
s5.通用测试源代码
这里是我写的用包括上述算法在内的多种算法的自动分类并10fold cross-validation的python代码,只要输入文件保持本文开头所述的格式(且不包含注释信息),即可用多种不同算法测试分类效果。download.
上一篇: Linux查询内存真实利用率的方法
下一篇: 预防冻疮的最佳办法 可用冷水摩擦易冻部位