【scikit-learn】01:使用案例對sklearn庫進行簡單介紹
阿新 • • 發佈:2019-02-11
# -*-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]]