1. 程式人生 > >【scikit-learn】01:使用案例對sklearn庫進行簡單介紹

【scikit-learn】01:使用案例對sklearn庫進行簡單介紹

# -*-coding:utf-8-*-
'''
    Author:kevinelstri
    Datetime:2017.2.16
'''
# -----------------------
# An introduction to machine learning with scikit-learn
# http://scikit-learn.org/stable/tutorial/basic/tutorial.html
# -----------------------

'''
    通過使用sklearn,簡要介紹機器學習,並給出一個簡單的例子
'''

'''
    Machine learning: the problem setting
''' ''' 機器學習: 就是對資料的一系列樣本進行分析,來預測資料的未知結果。 監督學習: 資料的預測來自於對已有的資料進行分析,進而對新增的資料進行預測。 監督學習可以劃分為兩類:分類和迴歸 非監督學習: 訓練資料由一系列沒有標籤的資料構成,目的就是發現這組資料中的相似性,也稱作聚類。 或者來發現資料的分佈情況,稱為密度估計。 訓練資料集、測試資料集: 機器學習就是通過學習一組資料,來將結果應用於一組新的資料中。 將一組資料劃分為兩個集合,一個稱為訓練集,一個稱為測試集。
''' ''' Loading an example dataset ''' ''' sklearn 有一些標準的資料集,iris,digits 資料集用於分類,boston house prices 資料集用於迴歸 ''' from sklearn import datasets iris = datasets.load_iris() # 載入iris資料集 digits = datasets.load_digits() # 載入digits資料集 # print iris # print digits ''' 資料集是一個類似字典的物件,它儲存所有的資料和一些有關資料的元資料。
資料儲存在.data中,這是一個(n_sample, n_features)陣列。 在監督學習問題中,多個變數儲存在.target中。 data:資料 target:標籤 n_sample:樣本數量 n_features:預測結果的數量 ''' print 'digits.data:', digits.data # 用來分類樣本的特徵 print 'digits.target:', digits.target # 給出了digits資料集的真實值,就是每個數字圖案對應的想預測的真實數字 print 'iris.data:', iris.data print 'iris.target:', iris.target print digits.images[0] print digits.images ''' Recognizing hand-written digits ''' import matplotlib.pyplot as plt from sklearn import datasets, svm, metrics digits = datasets.load_digits() # 載入資料集 ''' digits資料集中每一個數據都是一個8*8的矩陣 ''' images_and_labels = list(zip(digits.images, digits.target)) # 每個資料集都與標籤對應,使用zip()函式構成字典 for index, (image, label) in enumerate(images_and_labels[:4]): plt.subplot(2, 4, index + 1) plt.axis('off') plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') plt.title('Training:%i' % label) n_samples = len(digits.images) # 樣本的數量 print n_samples data = digits.images.reshape((n_samples, -1)) classifier = svm.SVC(gamma=0.001) # svm預測器 classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2]) # 使用資料集的一半進行訓練資料 expected = digits.target[n_samples / 2:] predicted = classifier.predict(data[n_samples / 2:]) # 預測剩餘的資料 print("Classification report for classifier %s:\n%s\n" % (classifier, metrics.classification_report(expected, predicted))) print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted)) images_and_predictions = list(zip(digits.images[n_samples / 2:], predicted)) # 圖片與預測結果按照字典方式對應 for index, (image, prediction) in enumerate(images_and_predictions[:4]): plt.subplot(2, 4, index + 5) plt.axis('off') plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') # 展示圖片 plt.title('Prediction: %i' % prediction) # 標題 # plt.show() ''' Learning and predicting ''' ''' digits資料集,就是給定一個圖案,預測其表示的數字是什麼。 樣本共有10個可能的分類(0-9),通過匹配(fit)預測器(estimator)來預測(predict)未知樣本所屬的分類。 sklearn中,分類的預測器就是為了實現fit(X,y)和predict(T)兩個方法(匹配和預測)。 fit(X,y):訓練資料 predict(T):預測資料 預測器sklearn.svm.SVC,就是為了實現支援向量機分類 ''' from sklearn import svm clf = svm.SVC(gamma=0.001, C=100.) ''' 預測器的名字是clf,這是一個分類器,它必須進行模型匹配(fit),也就是說,必須從模型中學習。 從模型學習的過程,模型匹配的過程,是通過將訓練集傳遞給fit方法來實現的。 本次實驗中將除了最後一個樣本的資料全部作為訓練集[:-1] ''' print clf.fit(digits.data[:-1], digits.target[:-1]) # 對前面所有的資料進行訓練 print clf.predict(digits.data[-1:]) # 對最後一個數據進行預測 ''' Model persistence 使用pickle儲存訓練過的模型 ''' from sklearn import svm from sklearn import datasets clf = svm.SVC() # 構造預測器 iris = datasets.load_iris() # 載入資料集 X, y = iris.data, iris.target # 資料的樣本數和結果數 clf.fit(X, y) # 訓練資料 import pickle s = pickle.dumps(clf) # 儲存訓練模型 clf2 = pickle.loads(s) # 載入訓練模型 print clf2.predict(X[0:1]) # 應用訓練模型 # 在scikit下,可以使用joblib's(joblib.dump, joblib.load)來代替pickle from sklearn.externals import joblib joblib.dump(clf, 'filename.pkl') # 儲存訓練模型 clf = joblib.load('filename.pkl') # 載入資料模型 print clf.predict(X[0:1]) # 應用訓練模型 ''' Conventions ''' from sklearn import datasets from sklearn.svm import SVC iris = datasets.load_iris() clf = SVC() clf.fit(iris.data, iris.target) print list(clf.predict(iris.data[:3])) # output:[0,0,0] # 由於iris.target是整型陣列,所以這裡的predict()返回的也是整型陣列 clf.fit(iris.data, iris.target_names[iris.target]) print list(clf.predict(iris.data[:3])) # output:['setosa', 'setosa', 'setosa'] # 這裡iris.target_names是字串名字,所以predict()返回的也是字串 ''' Refitting and updating parameters ''' import numpy as np from sklearn.svm import SVC rng = np.random.RandomState(0) X = rng.rand(100, 10) y = rng.binomial(1, 0.5, 100) X_test = rng.rand(5, 10) clf = SVC() clf.set_params(kernel='linear').fit(X, y) print clf.predict(X_test) # output:[1, 0, 1, 1, 0] clf.set_params(kernel='rbf').fit(X, y) print clf.predict(X_test) # output:[0, 0, 0, 1, 0] ''' Multiclass vs. multilabel fitting ''' from sklearn.svm import SVC from sklearn.multiclass import OneVsRestClassifier from sklearn.preprocessing import LabelBinarizer X = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]] y = [0, 0, 1, 1, 2] classif = OneVsRestClassifier(estimator=SVC(random_state=0)) print classif.fit(X, y).predict(X) # output:[0 0 1 1 2] y = LabelBinarizer().fit_transform(y) print classif.fit(X, y).predict(X) # output:[[1 0 0][1 0 0][0 1 0][0 0 0][0 0 0]] from sklearn.preprocessing import MultiLabelBinarizer y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]] y = MultiLabelBinarizer().fit_transform(y) print classif.fit(X, y).predict(X) # output:[[1 1 0 0 0][1 0 1 0 0][0 1 0 1 0][1 0 1 0 0][1 0 1 0 0]]