經Edwin Chen的推薦,認識了scikit-learn這個很是強大的python機器學習工具包。這個帖子做爲筆記。(其實都沒有筆記的意義,由於他家文檔作的太好了,不過仍是爲本身記記吧,爲之後節省若干分鐘)。若是有幸此文被想用scikit-learn的你看見,也仍是很是但願你去它們的主頁看文檔。主頁中最值得關注的幾個部分:User Guide幾乎是machine learning的索引,各類方法如何使用都有,Reference是各個類的用法索引。html
大多數數據的格式都是M個N維向量,分爲訓練集和測試集。因此,知道如何導入向量(矩陣)數據是最爲關鍵的一點。這裏要用到numpy來協助。假設數據格式是:python
Stock prices indicator1 indicator2算法 2.0 123 1252網絡 1.0 .. ..dom .. . .機器學習 .ide |
導入代碼參考:工具
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()#將稀疏矩陣轉化爲完整特徵矩陣 |
更多格式數據導入與生成參考:http://scikit-learn.org/stable/datasets/index.html
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]]) |
>>> 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) |
手工分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: http://en.wikipedia.org/wiki/F1_score |
more about cross-validation: http://scikit-learn.org/stable/modules/cross_validation.html
Note: if using LR, clf = LogisticRegression().
數據集,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更加有效百分 五到百分十。
這裏是我寫的用包括上述算法在內的多種算法的自動分類並10fold cross-validation的python代碼,只要輸入文件保持本文開頭所述的格式(且不包含註釋信息),便可用多種不一樣算法測試分類效果。