小白學(xué)數(shù)據(jù):教你用Python實(shí)現(xiàn)簡單監(jiān)督學(xué)習(xí)算法
編譯:文明、笪潔瓊、天培
監(jiān)督學(xué)習(xí)作為運(yùn)用最廣泛的機(jī)器學(xué)習(xí)方法,一直以來都是從數(shù)據(jù)挖掘信息的重要手段。即便是在無監(jiān)督學(xué)習(xí)興起的近日,監(jiān)督學(xué)習(xí)也依舊是入門機(jī)器學(xué)習(xí)的鑰匙。
這篇監(jiān)督學(xué)習(xí)教程適用于剛?cè)腴T機(jī)器學(xué)習(xí)的小白。
當(dāng)然了,如果你已經(jīng)熟練掌握監(jiān)督學(xué)習(xí),也不妨快速瀏覽這篇教程,檢驗(yàn)一下自己的理解程度。
一、什么是監(jiān)督學(xué)習(xí)?
在監(jiān)督學(xué)習(xí)中,我們首先導(dǎo)入包含有訓(xùn)練屬性和目標(biāo)屬性的數(shù)據(jù)集。監(jiān)督學(xué)習(xí)算法會從數(shù)據(jù)集中學(xué)習(xí)得出訓(xùn)練樣本和其目標(biāo)變量之間的關(guān)系,然后將學(xué)習(xí)到的關(guān)系對新樣本(未被標(biāo)記的樣本)進(jìn)行分類。
為了闡明監(jiān)督學(xué)習(xí)的工作原理,我們用根據(jù)學(xué)生學(xué)習(xí)時間預(yù)測其考試成績的例子來說明。
用數(shù)學(xué)表示,即Y = f(X)+ C,其中
- f表示學(xué)生學(xué)習(xí)時間和考試成績之間的關(guān)系
- X表示輸入(學(xué)習(xí)小時數(shù))
- Y表示輸出(考試分?jǐn)?shù))
- C表示隨機(jī)誤差
監(jiān)督學(xué)習(xí)算法的***目標(biāo)是給出新的輸入X,使得預(yù)測結(jié)果Y的準(zhǔn)確率***。有很多方法可以實(shí)現(xiàn)有監(jiān)督學(xué)習(xí),我們將探討幾種最常用的方法。
根據(jù)給定的數(shù)據(jù)集,機(jī)器學(xué)習(xí)可以分為兩大類:分類(Classification)和回歸(Regression)。如果給定的數(shù)據(jù)集的輸出值是類別,那么待解決是分類問題。如果給定的數(shù)據(jù)集的輸出值是連續(xù)的,那么該問題是回歸問題。
舉兩個例子
- 分類:判斷是貓還是狗。
- 回歸:房子的售價是多少?
二、分類
考慮這樣一個例子,醫(yī)學(xué)研究員想要分析乳腺癌數(shù)據(jù),用于預(yù)測患者使用三種治療方案中的哪一種。該數(shù)據(jù)分析問題就屬于分類問題,通過建立分類模型來預(yù)測類別標(biāo)簽,例如“治療方案A”、“治療方案B”或者“治療方案C”。
分類是一個預(yù)測類別標(biāo)簽的預(yù)測問題,這些類別標(biāo)簽都是離散和無序的。分類包含兩個步驟:學(xué)習(xí)步驟和分類步驟。
1. 分類方法和選擇***方法
一些常見的分類算法:
- K近鄰
- 決策樹
- 樸素貝葉斯
- 支持向量機(jī)
在學(xué)習(xí)步驟中,分類模型通過分析訓(xùn)練集數(shù)據(jù)建立一個分類器。在分類步驟中,分類器對給定的數(shù)據(jù)進(jìn)行分類。用于分析的數(shù)據(jù)集(包含數(shù)據(jù)和其對應(yīng)的標(biāo)簽)被劃分為訓(xùn)練集和測試集。訓(xùn)練集從分析用的數(shù)據(jù)集中隨機(jī)抽取。剩下的數(shù)據(jù)集構(gòu)成測試集。測試集和訓(xùn)練集相互獨(dú)立,即測試集中的數(shù)據(jù)不會被構(gòu)建于分類器。
測試集用于評價分類器的預(yù)測精度。分類器的精度用測試集中預(yù)測正確的百分比表示。為了獲得更高的精度,***的方法是測試多個不同的算法,同時,對每個算法嘗試不同的參數(shù)??梢酝ㄟ^交互檢驗(yàn)選擇***的算法和參數(shù)。
對于給定問題,在選取算法時,算法的精度、訓(xùn)練時間、線性、參數(shù)數(shù)目以及特殊情況都要考慮在內(nèi)。
在IRIS數(shù)據(jù)集上實(shí)現(xiàn)sklearn中的KNN,并對給定的輸入進(jìn)行花卉類型分類。
首先,要應(yīng)用機(jī)器學(xué)習(xí)算法,我們需要了解給定數(shù)據(jù)集的組成。在這個例子中,我們使用內(nèi)置在sklearn包中的IRIS數(shù)據(jù)集?,F(xiàn)在讓我們使用代碼查看IRIS數(shù)據(jù)集。
請確保你的電腦上成功安裝了Python。然后,通過PIP安裝下面這些python庫:
- pip install pandas
- pip install matplotlib
- pip install scikit-learn
在下面這段代碼中,我們使用pandas中的一些方法查看IRIS數(shù)據(jù)集的一些屬性。
- from sklearn import datasets
- import pandas as pd
- import matplotlib.pyplot as plt
- # Loading IRIS dataset from scikit-learn object into iris variable.
- iris = datasets.load_iris()
- # Prints the type/type object of iris
- print(type(iris))
- # <class 'sklearn.datasets.base.Bunch'>
- # prints the dictionary keys of iris data
- print(iris.keys())
- # prints the type/type object of given attributes
- print(type(iris.data), type(iris.target))
- # prints the no of rows and columns in the dataset
- print(iris.data.shape)
- # prints the target set of the data
- print(iris.target_names)
- # Load iris training dataset
- X = iris.data
- # Load iris target set
- Y = iris.target
- # Convert datasets' type into dataframe
- df = pd.DataFrame(X, columns=iris.feature_names)
- # Print the first five tuples of dataframe.
- print(df.head())
2. 輸出:
- <class ‘sklearn.datasets.base.Bunch’>
- dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])]
- <class ‘numpy.ndarray’> <class ‘numpy.ndarray’>
- (150, 4)
- [‘setosa’ ‘versicolor’ ‘virginica’]
- sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
- 0 5.1 3.5 1.4 0.2
- 1 4.9 3.0 1.4 0.2
- 2 4.7 3.2 1.3 0.2
- 3 4.6 3.1 1.5 0.2
- 4 5.0 3.6 1.4 0.2
三、Sklearn中的K最近鄰算法
如果一個算法僅存儲訓(xùn)練集數(shù)據(jù),并等待測試集數(shù)據(jù)的給出,那么這個算法便可認(rèn)為是一個“懶惰學(xué)習(xí)法”。直到給定測試集數(shù)據(jù),它才會根據(jù)它與存儲的訓(xùn)練集樣本的相似性來對新樣本進(jìn)行分類。
K近鄰分類器就是一個懶惰學(xué)習(xí)法。
K近鄰基于類比學(xué)習(xí),比較一個測試樣本和與之相似訓(xùn)練集數(shù)據(jù)。訓(xùn)練集有n個屬性表征。每個樣本由n維空間中的一個點(diǎn)表示。這樣,訓(xùn)練集中的所有樣本都儲存在n維模式空間中。當(dāng)給定一個未知的樣本,K近鄰分類器在模式空間中搜尋和未知樣本最接近的k個訓(xùn)練樣本。這k個訓(xùn)練樣本就是未知樣本的k個近鄰。
“接近度”用距離來度量,例如歐幾里得距離。較好的K值可以通過實(shí)驗(yàn)確定。
在下面這段代碼中,我們導(dǎo)入KNN分類器,將之應(yīng)用到我們的輸入數(shù)據(jù)中,然后對花卉進(jìn)行分類。
- from sklearn import datasets
- from sklearn.neighbors import KNeighborsClassifier
- # Load iris dataset from sklearn
- iris = datasets.load_iris()
- # Declare an of the KNN classifier class with the value with neighbors.
- knn = KNeighborsClassifier(n_neighbors=6)
- # Fit the model with training data and target values
- knn.fit(iris['data'], iris['target'])
- # Provide data whose class labels are to be predicted
- X = [
- [5.9, 1.0, 5.1, 1.8],
- [3.4, 2.0, 1.1, 4.8],
- ]
- # Prints the data provided
- print(X)
- # Store predicted class labels of X
- prediction = knn.predict(X)
- # Prints the predicted class labels of X
- print(prediction)
輸出:
- [1 1]
其中,0,1,2分別代表不同的花。在該例子中,對于給定的輸入,KNN分類器將它們都預(yù)測成為1這個類別的花。
KNN對IRIS數(shù)據(jù)集分類的直觀可視化
四、回歸
回歸通常被定義為確定兩個或多個變量之間的相關(guān)關(guān)系。例如,你要通過給定的數(shù)據(jù)X預(yù)測一個人的收入。這里,目標(biāo)變量是指該變量是我們關(guān)心以及想要預(yù)測的未知變量,而連續(xù)是指Y的取值沒有間隔。
預(yù)測收入是一個經(jīng)典的回歸問題。你的輸入應(yīng)當(dāng)包含所有與收入相關(guān)的個人信息(比如特征),這些信息可以預(yù)測收入,例如工作時長、教育經(jīng)歷、職稱以及他的曾住地等。
1. 回歸模型
一些常見的回歸模型有
- 線性回歸
- 邏輯回歸
- 多項(xiàng)式回歸
線性回歸通過擬合一條直線(回歸線)來建立因變量(Y)與一個或多個自變量(X)之間關(guān)系。
用數(shù)學(xué)公示表示,即h(xi) = βo + β1 * xi + e,其中
- βo是截距
- β1是斜率
- e是誤差項(xiàng)
用圖表示,即
邏輯回歸是一種預(yù)測類別的算法,用于找出特征和特定輸出概率之間關(guān)系。
當(dāng)然了,我們也可以把邏輯回歸歸類為分類算法,但就像我們剛才所說,邏輯回歸的輸出其實(shí)是目標(biāo)對象屬于某一類別的概率。既然概率是連續(xù)的,我們依舊把邏輯回歸算作回歸算法。
用數(shù)學(xué)公式表示:p(X) = βo + β1 * X,其中p(x) = p(y = 1 | x)
圖形表示為:
多項(xiàng)式回歸是一種將自變量x與因變量y的關(guān)系擬合為x的n階多項(xiàng)式的回歸算法。
2. 解決線性回歸問題
我們有數(shù)據(jù)集X,以及對應(yīng)的目標(biāo)值Y,我們使用普通最小二乘法通過最小化預(yù)測誤差來擬合線性模型
給定的數(shù)據(jù)集同樣劃分為訓(xùn)練集和測試集。訓(xùn)練集由已知標(biāo)簽的樣本組成,因此算法能夠通過這些已知標(biāo)簽的樣本來學(xué)習(xí)。測試集樣本不包含標(biāo)簽,你并不知道你試圖預(yù)測樣本的標(biāo)簽值。
我們將選擇一個需要訓(xùn)練的特征,應(yīng)用線性回歸方法擬合訓(xùn)練數(shù)據(jù),然后預(yù)測測試集的輸出。
3. 用Sklearn實(shí)現(xiàn)線性回歸
- from sklearn import datasets, linear_model
- import matplotlib.pyplot as plt
- import numpy as np
- # Load the diabetes dataset
- diabetes = datasets.load_diabetes()
- # Use only one feature for training
- diabetesdiabetes_X = diabetes.data[:, np.newaxis, 2]
- # Split the data into training/testing sets
- diabetes_Xdiabetes_X_train = diabetes_X[:-20]
- diabetes_Xdiabetes_X_test = diabetes_X[-20:]
- # Split the targets into training/testing sets
- diabetesdiabetes_y_train = diabetes.target[:-20]
- diabetesdiabetes_y_test = diabetes.target[-20:]
- # Create linear regression object
- regr = linear_model.LinearRegression()
- # Train the model using the training sets
- regr.fit(diabetes_X_train, diabetes_y_train)
- # Input data
- print('Input Values')
- print(diabetes_X_test)
- # Make predictions using the testing set
- diabetes_y_pred = regr.predict(diabetes_X_test)
- # Predicted Data
- print("Predicted Output Values")
- print(diabetes_y_pred)
- # Plot outputs
- plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
- plt.plot(diabetes_X_test, diabetes_y_pred, color='red', linewidth=1)
- plt.show()
4. 輸入
輸入值:
- [
- [ 0.07786339] [-0.03961813] [ 0.01103904] [-0.04069594]
- [-0.03422907] [ 0.00564998] [ 0.08864151] [-0.03315126]
- [-0.05686312] [-0.03099563] [ 0.05522933] [-0.06009656]
- [ 0.00133873] [-0.02345095] [-0.07410811] [ 0.01966154]
- [-0.01590626] [-0.01590626] [ 0.03906215] [-0.0730303 ]
- ]
預(yù)測的輸出值:
- [
- 225.9732401 115.74763374 163.27610621 114.73638965
- 120.80385422 158.21988574 236.08568105 121.81509832
- 99.56772822 123.83758651 204.73711411 96.53399594
- 154.17490936 130.91629517 83.3878227 171.36605897
- 137.99500384 137.99500384 189.56845268 84.3990668
- ]
五、結(jié)語
提一下常用的監(jiān)督學(xué)習(xí)的python庫
- Scikit-Learn
- Tensorflow
- Pytorch
原文鏈接:https://towardsdatascience.com/supervised-learning-with-python-cf2c1ae543c1
【本文是51CTO專欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】