python 分类变量回归_极简Python带你探索分类与回归的奥秘
為何使用人工智能和機(jī)器學(xué)習(xí)?
地球的未來在于人工智能和機(jī)器學(xué)習(xí)。如果對這些技術(shù)一無所知,人們很快會發(fā)現(xiàn)自己落伍了。世界發(fā)展日新月異,每天都發(fā)生著不可思議的變化。在人工智能和機(jī)器學(xué)習(xí)中,有許多實(shí)現(xiàn)和技術(shù)能夠解決實(shí)時問題。其中,監(jiān)督學(xué)習(xí)是最常用的方法之一。「人工智能的關(guān)鍵在于表示。」——Jeff Hawkins
什么是監(jiān)督學(xué)習(xí)?
在監(jiān)督學(xué)習(xí)中,我們首先導(dǎo)入包含訓(xùn)練屬性和目標(biāo)屬性的數(shù)據(jù)集。監(jiān)督學(xué)習(xí)算法將學(xué)習(xí)訓(xùn)練樣本和其目標(biāo)變量之間的關(guān)系,然后應(yīng)用習(xí)得的關(guān)系對無目標(biāo)屬性的全新輸入進(jìn)行預(yù)測。
為了闡明監(jiān)督學(xué)習(xí)如何工作,讓我們考慮一個案例:根據(jù)學(xué)生的學(xué)習(xí)時長預(yù)測學(xué)生的成績。
數(shù)學(xué)公式如下:
Y = f(X)+ C
其中,F 代表學(xué)生準(zhǔn)備考試的時長與考試分?jǐn)?shù)之間的關(guān)系。X 是輸入(學(xué)習(xí)時長),Y 是輸出(學(xué)生在考試中的得分),C 代表隨機(jī)誤差。
監(jiān)督學(xué)習(xí)算法的最終目標(biāo)是:給定新輸入 X 時以最大的準(zhǔn)確率預(yù)測 Y 的值。有幾種方法都可以實(shí)現(xiàn)監(jiān)督學(xué)習(xí),我們將探索其中一些最常用的方法。
基于給定的數(shù)據(jù)集,機(jī)器學(xué)習(xí)問題將分為兩類:分類和回歸。如果給定數(shù)據(jù)同時具有輸入(訓(xùn)練)值和輸出標(biāo)簽,那么它屬于分類問題。如果數(shù)據(jù)集有著連續(xù)數(shù)值屬性而沒有任何目標(biāo)標(biāo)簽,那么它屬于回歸問題。Classification: Has the output label. Is it a Cat or Dog?
Regression: How much will the house sell for?
分類問題
讓我們來舉例說明。一名醫(yī)學(xué)研究者希望通過分析乳腺癌數(shù)據(jù)來預(yù)測患者應(yīng)該接受三種治療方式中的哪一種。這個數(shù)據(jù)分析任務(wù)屬于分類,其中構(gòu)建的模型或分類器需要預(yù)測類別的標(biāo)簽,比如「療法 1」、「療法 2」、「療法 3」。
分類問題預(yù)測離散且無序的類別標(biāo)簽。這個過程分兩個階段:學(xué)習(xí)階段、分類階段。
分類方法以及如何選擇最合適的方法
最常用的算法包括:
1. K 近鄰
2. 決策樹
3. 樸素貝葉斯
4. 支持向量機(jī)
在學(xué)習(xí)階段,分類模型通過分析訓(xùn)練集來構(gòu)建分類器。在分類階段,模型會預(yù)測出給定數(shù)據(jù)的類別標(biāo)簽。被分析的數(shù)據(jù)集元組及其相關(guān)類別標(biāo)簽被分隔成訓(xùn)練集和測試集。我們從要分析的數(shù)據(jù)集中隨機(jī)抽取部分元組構(gòu)成訓(xùn)練集。剩下的數(shù)據(jù)自然就是測試集了,且二者相互獨(dú)立,也就是說測試集不參與訓(xùn)練過程。
測試集用于評估分類器的預(yù)測準(zhǔn)確率。分類器的準(zhǔn)確率指分類器在測試集中作出正確預(yù)測的百分比。為了達(dá)到更高的準(zhǔn)確率,最好的方法是測試不同的算法并針對每一種算法進(jìn)行調(diào)參。最后通過交叉驗(yàn)證可以找出最佳分類器。
為了給任務(wù)選擇一個好的算法,我們必須考慮不同算法的準(zhǔn)確率、訓(xùn)練時間、線性度、參數(shù)數(shù)量及特殊情況。
下面我們將運(yùn)用 Scikit-Learn 在 IRIS 數(shù)據(jù)集上實(shí)現(xiàn) KNN 算法,并根據(jù)給定輸入預(yù)測花的種類。
首先,我們需要深入理解、探索給定數(shù)據(jù)集,這樣才能應(yīng)用機(jī)器學(xué)習(xí)算法。在本例中,我們使用了從 scikit-learn 導(dǎo)入的 IRIS 數(shù)據(jù)集。接下來我們邊看代碼邊分析數(shù)據(jù)集。
請確保你的電腦上已經(jīng)安裝了 Python。然后,請使用 PIP 安裝如下程序包:pip install pandas
pip install matplotlib
pip install scikit-learn
在下面的代碼片段中,我們調(diào)用幾個 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))
#
# 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())
輸出:
dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])]
(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 中 的 K 近鄰算法
如果一個算法只保存訓(xùn)練集的元組,待收到測試元組后再進(jìn)行處理,那么它就是懶惰學(xué)習(xí)算法(Lazy Learner )。該算法只有收到測試數(shù)據(jù)時才執(zhí)行泛化,基于測試數(shù)據(jù)與已保存的訓(xùn)練數(shù)據(jù)的相似性進(jìn)行分類。
K 近鄰分類器就是一種懶惰學(xué)習(xí)算法。
KNN 基于類比學(xué)習(xí)。所謂類比學(xué)習(xí),就是通過比較給定的測試元組和與其相似的訓(xùn)練元組來學(xué)習(xí)。訓(xùn)練元組由 n 個屬性來描述。每一個元組表示 n 維空間中的一個點(diǎn)。如此一來,所有的訓(xùn)練元組都保存在 n 維模式空間中。當(dāng)輸入未知元組時,k 近鄰分類器在模式空間中搜索最接近未知元組的 k 個訓(xùn)練元組。這 k 個訓(xùn)練元組就是未知元組的 k 個「最近鄰」。
「親密度」由距離度量定義,例如歐式距離。合適的 K 值根據(jù)實(shí)驗(yàn)而定。
在下面的代碼片段中,我們從 sklearn 中導(dǎo)入 KNN 分類器,將其用于我們的輸入數(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 對應(yīng) Versicolor(雜色鳶尾)、1 對應(yīng) Virginica(維吉尼亞鳶尾)、2 對應(yīng) Setosa(山鳶尾)。基于給定輸入,使用 KNN 分類器,兩張圖中的花都被預(yù)測為 Versicolor。
用于 IRIS 數(shù)據(jù)集分類的 KNN 算法直觀圖
回歸
我們通常將確定兩個或多個變量之間關(guān)系的過程叫做回歸。例如,通過給定的輸入數(shù)據(jù) X 來預(yù)測某人的收入。
這里的目標(biāo)變量是我們要預(yù)測的未知變量,連續(xù)性指的是 Y 值之間不存在間隙(間斷)。
預(yù)測收入是一個經(jīng)典的回歸問題。你的輸入數(shù)據(jù)應(yīng)包括所有可用于預(yù)測收入的信息(也叫特征),例如工作時長、教育程度、職位、住所等。
回歸模型
最常用的回歸模型如下:線性回歸
Logistic 回歸
多項(xiàng)式回歸
線性回歸使用最佳擬合直線(即回歸線)在因變量 Y 和一或多個自變量 X 之間建立關(guān)聯(lián)。
數(shù)學(xué)公式如下:h(xi) = βo + β1 * xi + e
其中 βo 代表截距,β1 代表回歸線的斜率,e 是誤差項(xiàng)。
圖形表示如下:
Logistic 回歸算法應(yīng)用在因變量屬于某一類別的情況。Logistic 回歸的思想是找出特征與特定輸出概率之間的關(guān)系。
數(shù)學(xué)公式如下:p(X) = βo + β1 * X
其中,p(x) = p(y = 1 | x)。該函數(shù)的圖形表示如下:
多項(xiàng)式回歸是回歸分析的一種形式。以 x 的 n 次多項(xiàng)式形式對自變量 x 和因變量 y 之間的關(guān)系進(jìn)行建模。
解決線性回歸問題
對于數(shù)據(jù)集 X 及對應(yīng)的目標(biāo)值 Y,我們使用普通最小二乘法訓(xùn)練一個線性模型。通過這個模型,我們可以以盡可能小的誤差來預(yù)測給定未知輸入 x 的輸出值 y。
給定數(shù)據(jù)被分隔成訓(xùn)練集和測試集。訓(xùn)練集是有標(biāo)注的(已加載特征值),因此該算法可以從這些標(biāo)注樣本中學(xué)習(xí)。測試集沒有標(biāo)注,即你不知道要預(yù)測的值。
我們以要訓(xùn)練的一個特征為例,運(yùn)用線性回歸擬合訓(xùn)練集,然后使用測試集進(jìn)行預(yù)測。
在 scikit-learn 中實(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
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
]
undefined
Graph between (diabetes_X_test, diabetes_y_pred) predictions will be continuous on the line equation.
(diabetes_X_test, diabetes_y_pred) 預(yù)測圖是線性且連續(xù)的。
(diabetes_X_test, diabetes_y_pred) 預(yù)測圖是線性且連續(xù)的。
總結(jié)
以上是生活随笔為你收集整理的python 分类变量回归_极简Python带你探索分类与回归的奥秘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科学写作与哲学
- 下一篇: python分类预测降低准确率_十分钟掌