機器學習入門——使用python進行監督學習
什麼是監督學習?
在監督學習中,我們首先要匯入包含訓練特徵和目標特徵的資料集。監督式學習演算法會學習訓練樣本與其相關的目標變數之間的關係,並應用學到的關係對全新輸入(無目標特徵)進行分類。
為了說明如何監督學習的原理,讓我們看一個根據學生學習的時間來預測學生的成績的例子。
公式:
Y = f(X)+ C
在這裡:
F表示學生為考試準備的小時數和分數之間的關係 X是輸入(他睡覺的小時數) Y是輸出(標記在考試中學生的得分) C是隨機誤差
監督學習演算法的最終目標是以最大精度來預測給定新輸入X所對應的Y.有很多種方法可以實現監督學習; 我們在這裡討論一些最常用的方法。
根據給定的資料集,機器學習問題分為兩類:分類
分類:輸出標籤:這個是貓還是狗?
迴歸:這個房子賣多少錢?
分類
以想要分析乳腺癌的資料的醫學研究人員為例。目標是預測患者應接受三種治療方法中的哪一種。這種資料分析任務被稱為分類,在這個分類中,模型或分類器被構造來預測類標籤,例如“治療a”、“治療B”或“治療c”。
分類是預測問題,預測離散和無序的分類的類標籤。這一過程,由學習步驟和分類步驟兩部分組成。
分類中方法
最常用的分類演算法:
1.KNN演算法(K-Nearest Neighbo)
2.決策樹
3.樸素貝葉斯
4. 支援向量機
在學習步驟中,分類模型通過分析訓練集來建立分類器。在分類步驟中,預測給定資料的類標籤。在分析中,資料集元組及其關聯的類標籤分為訓練集和測試集。構成訓練集的各個元組從隨機抽樣的資料集中進行分析。剩下的元組形成測試集,並且獨立於訓練元組,也就是說它們不會用來構建分類器。
測試集用於估計分類器預測的準確性。分類器的準確性是指由分類器正確分類的測試元組的百分比。為了達到更好的準確性,最好測試不同的演算法,並在每個演算法中嘗試不同的引數。最好通過交叉驗證進行選擇。
想要為某個問題選擇合適的演算法,對於不同的演算法,精度、訓練時間、線性度、引數個數和特殊情況等引數都需要考慮。
在IRIS資料集上使用Scikit-Learn實現KNN,根據給定的輸入對花進行分類。
第一步,為了應用我們的機器學習演算法,我們需要了解和探索給定的資料集。在這個例子中,我們使用從scikit-learn包匯入的IRIS資料集(鳶尾花資料集)。現在讓我們來編碼並探索IRIS資料集。
確保你的機器上已經安裝了Python。然後使用PIP安裝以下軟體包:
pip install pandas
pip install matplotlib
pip install scikit-learn
在這段程式碼中,我們使用pandas中的幾種方法瞭解了IRIS資料集的屬性。
from sklearnimport 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())
輸出:
<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
Scikit-learn中的KNN
如果一個演算法只是簡單地儲存訓練集的元組並等待給出測試元組,那麼他就是一個惰性學習法。只有當它看到測試元組時才會執行泛化,基於它與訓練元組的相似度對元組進行分類。
KNN是一個惰性學習法。
KNN基於類比學習,比較出給定的測試元組與訓練元組的相似度。訓練元組由n個特徵描述。每個元組代表一個n維空間中的一個點。這樣,所有的訓練元組都儲存在n維模式空間中。當給定未知元組時,KNN分類器在模式空間中搜索最接近未知元組的k個訓練元組。這k個訓練元組是未知元組的k個“最近鄰(nearest neighbor)”。
貼近度(Closeness)由關於距離的度量定義(例如歐幾里得度量)。一個好的K值要通過實驗確定。
在這段程式碼中,我們從sklearn中匯入KNN分類器,並將其應用到我們的輸入資料,對花進行分類。
from sklearnimport datasets
from sklearn.neighborsimport 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對應的Versicolor 1對應的Virginica 2對應Setosa
(注:都是鳶尾花的種類)
基於給定的輸入,機器使用KNN預測兩個花都是Versicolor。
IRIS資料集分類直觀圖:
迴歸
迴歸通常被用於確定兩個或多個變數之間的關係。例如,根據給定的輸入資料X,你必須預測一個人的收入。
在迴歸裡,目標變數是指我們想要預測的未知變數,連續意味著Y可以承擔的值沒有缺口(或者說間斷點)。
預測收入是一個典型的迴歸問題。你的輸入資料包含所有可以預測收入的資訊(即特徵)。比如他的工作時間,教育經歷,職位和居住地。
迴歸模型
一些常用的迴歸模型是:
- 線性迴歸
- Logistic迴歸
- 多項式迴歸
線性迴歸使用最佳擬合直線(也稱迴歸線)建立因變數(Y)和一個或多個自變數(X)之間的關係。
用公式表示:
h(xi)=βo+β1* xi + e
其中βo是截距,β1是線的斜率,e是誤差項。
線性迴歸
Logistic迴歸是一種演算法,可以在響應變數是分類(categorical)時使用。Logistic迴歸的思想是找出特徵和特定結果的概率之間的關係。
用公式表示為:
p(X)=βo+β1* X
p(x)= p(y = 1 | x)
Logistic迴歸
多項式迴歸是一種迴歸分析方法,其中自變數x和因變數y之間的關係被建模為x中的一個n次多項式。
解決線性迴歸問題:
我們有資料集X和相應的目標值Y,我們使用最小二乘法來學習一個線性模型,我們可以使用這個線性模型來預測一個新的y,給出一個未知的x,它的誤差越小越好。
將給定的資料被分成訓練資料集和測試資料集。訓練集具有標籤(載入特徵),所以演算法可以從這些標籤的例子中學習。測試集沒有任何標籤,也就是說,你還不知道這個值,試圖去預測。
我們將拿出一個特徵進行訓練,並應用線性迴歸方法來擬合訓練資料,然後使用測試資料集預測輸出。
線性迴歸在scikit-learn中的實現:
from sklearnimport 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
diabetes_X= diabetes.data[:, np.newaxis,2]
# Split the data into training/testing sets
diabetes_X_train= diabetes_X[:-20]
diabetes_X_test= diabetes_X[-20:]
# Split the targets into training/testing sets
diabetes_y_train= diabetes.target[:-20]
diabetes_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()
輸出:
Input Values
[
[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 ]
]
Predicted Output Values
[
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
]
預測diabetes_X_test和diabetes_y_pred之間的圖線上性方程上連續。
- 程式碼:https://github.com/vihar/supervised-learning-with-python