
上一篇文章中介紹了機器學習的簡單知識,還有python中進行機器學習實踐需要的生態(tài)環(huán)境,接下來將會通過鳶尾花分類這個例子對機器學習做一個簡要的介紹。通過一步一步地實現(xiàn)這個項目來介紹以下內(nèi)容。
可以說這并不是一個正式的項目,只是用來做一個簡單的展示,用于給初次接觸機器學習的讀者快速了解機器學習的過程和結果。
學習編程時,往往我們的第一句代碼就是print(“Hello World”),而接下來的這個數(shù)據(jù)集,可以說得上是機器學習中的Hello World頂目,入門學習機器學習的過程中最常見的一個數(shù)據(jù)集。
這個項目是針對鳶尾花(Iris Flower)進行分類的一個項目,數(shù)據(jù)集是含鳶尾花的三個亞屬的分類信息,通過機器學習算法生成一個模型,自動分類新數(shù)據(jù)到這三個亞屬的某一個中。項目中使用的鳶尾花數(shù)據(jù)集是一個非常容易理解的數(shù)據(jù)集,這個數(shù)據(jù)集具有以下特點:
接下來我們將通過這個例子一步步地來展示一個機器學習項目的簡化步驟。我們將按照下面的步驟實現(xiàn)這個項目 :
(1)導入數(shù)據(jù)。
(2)概述數(shù)據(jù)。
(3)數(shù)據(jù)可視化。
(4)評估算法。
(5)實施預測。
在整個項目的過程中,最好嘗試自己輸入每一行代碼,以加深對機器學習項目流程的理解。
導入項目所需的各種數(shù)據(jù)處理、數(shù)據(jù)可視化以及機器學習相關庫和鳶尾花(Iris Flower)數(shù)據(jù)集。
導入在項目中將要使用的類庫和方法 。 代碼如下 :
# 導入類庫 from pandas import read_csv
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
所有類庫的導入都不應有錯誤提示。如果出現(xiàn)了錯誤提示,那么暫時停下來,先設置一個能夠運行的SciPy環(huán)境。
在本項目中我們使用的是 UCI 機器學習數(shù)據(jù)倉庫中的鳶尾花(Iris Flower)數(shù)據(jù)集(
http://archive.ics.uci.edu/rnl/datasets/Iris),不需要下載,可以通過sklearn模塊中datasets導入數(shù)據(jù)直接使用。在這里將使用Pandas來導入數(shù)據(jù)和對數(shù)據(jù)進行描述性統(tǒng)計分析,并利用 Matplotlib實現(xiàn)數(shù)據(jù)可視化。需要注意的是,在導入數(shù)據(jù)時,為每個數(shù)據(jù)特征設定了名稱,這有助于后面對數(shù)據(jù)的展示工作,尤其是通過圖表展示數(shù)據(jù)。 代碼如下:
## 導入數(shù)據(jù) import pandas as pd # 導入pandas庫
from sklearn import datasets # 導入sklearn模塊中的datasets,用以導入數(shù)據(jù)
iris = datasets.load_iris() # 直接導入數(shù)據(jù)
dataset = pd.DataFrame(data=iris.data,columns=iris.feature_names) # 用DataFrame存放數(shù)據(jù)
在導入數(shù)據(jù)之后,我們需要先看一下數(shù)據(jù),增加對數(shù)據(jù)的理解,以便選擇合適的算法。我們將從以下幾個角度來審查數(shù)據(jù):
(1)數(shù)據(jù)的維度。
(2)查看數(shù)據(jù)自身 。
(3)統(tǒng)計描述所有的數(shù)據(jù)特征。
(4)數(shù)據(jù)分類的分布情況。
不要擔心這會需要很多代碼,每一種審查方法只有一行代碼。這些代碼非常有效,在以后的項目中也會用到。
通過查看數(shù)據(jù)的維度,可以對數(shù)據(jù)集有一個大概的了解,如數(shù)據(jù)集中有多少行數(shù)據(jù)、數(shù)據(jù)有幾個屬性等。代碼如下 :
#顯示數(shù)據(jù)維度 print('數(shù)據(jù)維度: 行 %s,列 %s' % dataset.shape)
將會得到一個具有 150 行數(shù)據(jù), 4 個數(shù)據(jù)特征屬性的結果,執(zhí)行結果如下:
數(shù)據(jù)維度: 行 150,列 4
查看數(shù)據(jù)自身也是一個很好的理解數(shù)據(jù)的方法,通過查看數(shù)據(jù)可以直觀地看到數(shù)據(jù)的特征、數(shù)據(jù)的類型,以及大概的數(shù)據(jù)分布范圍等。代碼如下:
# 查看數(shù)據(jù)的前10行 print(dataset.head(10))
在這里查看前10行記錄,執(zhí)行結果如下:
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 5 5.4 3.9 1.7 0.4 6 4.6 3.4 1.4 0.3 7 5.0 3.4 1.5 0.2 8 4.4 2.9 1.4 0.2 9 4.9 3.1 1.5 0.1
數(shù)據(jù)特征的統(tǒng)計描述信息包括數(shù)據(jù)的行數(shù)、中位值、最大值、最小值、均值、四分位值等統(tǒng)計數(shù)據(jù)信息。我們需要通過這些統(tǒng)計的信息來大致了解數(shù)據(jù)的情況。配合箱線圖能夠很好了了解數(shù)據(jù)的分布和數(shù)值大小還有異常值情況等,代碼如下:
# 統(tǒng)計描述數(shù)據(jù)信息 print(dataset.describe())
執(zhí)行結果如下:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000
接下來看一下數(shù)據(jù)在不同分類的分布情況,執(zhí)行程序后得到的將是每個分類數(shù)據(jù)量的絕對的數(shù)值,看一下各個分類的數(shù)據(jù)分布是否均衡。代碼如下:
# 分類分布情況 target = [x for x in iris.target] for item in set(target): print("{} : {}".format(item,target.count(item)))
這里就是通過前面設定的數(shù)據(jù)特征名稱來查看數(shù)據(jù)的 。 執(zhí)行結果如下:
0 : 50 1 : 50 2 : 50
我們可以看到鶯尾花的三個亞屬的數(shù)據(jù)各 50 條,分布非常平衡。如果數(shù)據(jù)的分布不平衡時,可能會影響到模型的準確度。因此,當數(shù)據(jù)分布不平衡時,需要對數(shù)據(jù)進行處理,調(diào)整數(shù)據(jù)到相對平衡的狀態(tài)。調(diào)整數(shù)據(jù)平衡時有以下幾種方法。
通過對數(shù)據(jù)集的審查,對數(shù)據(jù)有了一個基本的了解,接下來將通過圖表來進一步查看數(shù)據(jù)特征的分布情況和數(shù)據(jù)不同特征之間的相互關系 。
## 畫圖顯示 import matplotlib.pyplot as plt
%matplotlib inline # 直方圖
plt.hist(target,[-0.5,0.5,1.5,2.5],rwidth=0.6)
plt.show()
“C:\Users\CDA\Desktop\CDA\02 - SEO\01 - 原創(chuàng)\【算法應用】機器學習python應用-簡單機器學習項目實踐\圖片\類別情況.png”
相對于數(shù)值而言,數(shù)據(jù)可視化后就非常直觀,我們可以清晰地了解到數(shù)據(jù)中的標簽類別個數(shù)以及每種類別間的大致比例情況。
單變量圖表可以顯示每一個單獨的特征屬性,因為每個特征屬性都是數(shù)字,因此我們可以通過箱線圖來展示屬性與中位值的離散速度,了解數(shù)據(jù)偏向和異常值情況。 代碼如下:
# 箱線圖 dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) plt.show()
執(zhí)行結果:
# 直方圖 dataset.hist() plt.show()
在輸出的圖表中,我們看到 separ- length 和 separ-width 這兩個特征比較符合高斯分布。執(zhí)行結果如圖 3-2 所示 。
通過多變量圖表可以查看不同特征屬性之間的關系。我們通過散點矩陣圖來查看每個屬性之間的影響關系。
# 散點矩陣圖 import seaborn as sns # 導入畫圖庫-seaborn
plt.figure(figsize=(15.0, 10.0))
sns.pairplot(dataset, diag_kind = 'kde',
plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
size =3)
# 保存圖片
plt.savefig('scatter_matrix.jpg', dpi=100, bbox_inches='tight')
執(zhí)行結果如下所示,對角線上的四副圖是四個特征的分布情況,其意義和前面的直方圖內(nèi)容的意義是一致的,很明顯看出 separ- length 和 separ-width 這兩個特征是單峰的,比較符合高斯分布;而 petal length 和 petal width是雙峰的。除了對角線外的其他圖則是散點圖的形式,它們表示的是不同特征間的相關性,從圖中我們可以看出 petal length 和 petal width這兩個特征間有著明顯的線性相關性。如果是回歸模型中,出現(xiàn)多重共線性的特征是需要進行處理的,但我們目前只是簡單的展示一下分類機器學習的大致流程,所以就沒必須做處理了。
一般在機器學習的項目中,數(shù)據(jù)清洗、數(shù)據(jù)處理就占去了整個項目的80%的工作量,所以這是機器學習項目中非常重要的一個環(huán)節(jié),但在本項目中,iris的數(shù)據(jù)已經(jīng)是非常完善的,不需要再進行過多的數(shù)據(jù)處理過程。如此我們只需要簡單處理一下原數(shù)據(jù),使其更適合在某些有特殊要求的算法上使用。
不同的算法對數(shù)據(jù)也有不同的要求,比如KNN算法,因為一般是基于歐式距離進行計算,所以也要求數(shù)據(jù)必須要做標準化,否則建模過程中大小不一的特征的實際權重也會不同,數(shù)值較大的特征將會覆蓋掉數(shù)值較小的特征。為了解決這中影響,我們可以將數(shù)據(jù)標準化,執(zhí)行代碼如下:
# 標準化處理
from sklearn import preprocessing
#建立StandardScaler對象 std = preprocessing.StandardScaler()
data_std = std.fit_transform(dataset)
模型被創(chuàng)建后需要知道創(chuàng)建的模型是否足夠好。在選擇算法的過程中會采用統(tǒng)計學方法來評估算法模型。但是,我們更想知道算法模型對真實數(shù)據(jù)的準確度如何,這就是保留一部分數(shù)據(jù)來評估算法模型的主要原因。下面將按照70%的訓練數(shù)據(jù)集,30%的評估數(shù)據(jù)集來分離數(shù)據(jù)。代碼如下:
# 分離數(shù)據(jù)集 ## 原數(shù)據(jù) X_train, X_validation, Y_train, Y_validation = train_test_split(dataset, target, test_size=0.3, random_state=12) ## 標準化數(shù)據(jù) X_train_std, X_validation_std, Y_train, Y_validation = train_test_split(data_std, target, test_size=0.3, random_state=12)
現(xiàn)在就分離出了 X_train 和 Y_train 或者標準化后的X_train_std和Y_train用來訓練算法創(chuàng)建模型, x_validation(X_validation_std)和Y_validation 在后面會用來驗證評估模型。
通過不同的算法來創(chuàng)建模型,并評估它們的準確度,以便找到最合適的算法。將按照下面的步驟進行操作:
(1)采用 10 折交叉驗證來評估算法模型 。
(2)生成幾個常用的分類模型來預測新數(shù)據(jù) 。
(3)選擇最優(yōu)模型
在這里將通過 10 折交叉驗證來分離訓練數(shù)據(jù)集,并評估算法模型的準確度。10 折交叉驗證是隨機地將數(shù)據(jù)分成 10 份,9 份用來訓練模型,1 份用來評估算法。后面我們會使用相同的數(shù)據(jù)對每一種算法進行訓練和評估 , 并從中選擇最好的模型。
對任何問題來說,不能僅通過對數(shù)據(jù)進行審查,就判斷出哪個算法最有效。通過前面的圖表,發(fā)現(xiàn)有些數(shù)據(jù)特征符合線性分布,所有可以期待算法會得到比較好的結果 。
接下來評估六種不同的算法:
這個算法列表中包含了線性算法(LR)和非線性算法(ANN、KNN 、CART、NB和SVM)。在每次對算法進行評估前都會重新設置隨機數(shù)的種子,以確保每次對算法的評估都使用相同的數(shù)據(jù)集,保證算法評估的準確性。接下來就創(chuàng)建并評估這六種算法模型。代碼如下:
# 算法審查
models = {}
models['LR'] = LogisticRegression()
models['ANN'] = MLPClassifier()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()
# 評估算法
results = [] for key in models:
kfold = KFold(n_splits=10, random_state=seed)
cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results) print('原數(shù)據(jù):%s: %f (%f)' %(key, cv_results.mean(), cv_results.std()))
results = [] for key in models:
kfold = KFold(n_splits=10, random_state=seed)
cv_results = cross_val_score(models[key], X_train_std, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results) print('標準化數(shù)據(jù):%s: %f (%f)' %(key, cv_results.mean(), cv_results.std()))
現(xiàn)在已經(jīng)有了六種模型,并且評估了它們的精確度。接下來就需要比較這六種模型,并選出準確度最高的算法。執(zhí)行上面的代碼,結果如下 :
原數(shù)據(jù):LR: 0.933636 (0.062463)
原數(shù)據(jù):ANN: 0.972727 (0.041660)
原數(shù)據(jù):KNN: 0.972727 (0.041660)
原數(shù)據(jù):CART: 0.914545 (0.066953)
原數(shù)據(jù):NB: 0.933636 (0.062463)
原數(shù)據(jù):SVM: 0.963636 (0.060302)
標準化數(shù)據(jù):LR: 0.887273 (0.069734)
標準化數(shù)據(jù):ANN: 0.942727 (0.064801)
標準化數(shù)據(jù):KNN: 0.942727 (0.046895)
標準化數(shù)據(jù):CART: 0.914545 (0.066953)
標準化數(shù)據(jù):NB: 0.933636 (0.062463)
標準化數(shù)據(jù):SVM: 0.951818 (0.065813)
通過上面的結果,可以看出實際上用原數(shù)據(jù)進行建模的結果反而更好,說明這份數(shù)據(jù)不需要再更變動了。然后6種算法中神經(jīng)網(wǎng)絡和KNN算法的準確率最高,這種情況下怎么辦,該如何確定哪個才是更好的。接下來創(chuàng)建一個箱線圖,通過圖表來比較算法的評估結果。 代碼如下 :
# 箱線圖比較算法 fig = plt.figure() fig.suptitle('Algorithm Comparison') ax = fig.add_subplot(111) plt.boxplot(results) ax.set_xticklabels(models.keys()) plt.show()
執(zhí)行結果:
我們可以看出,雖然總體的平均準確率和標準差是一樣的,但是ANN算法的中值相對KNN的更高,說明ANN算法的相對來說會更好一點。
評估的結果顯示,神經(jīng)網(wǎng)絡(ANN) 是準確度最高的算法?,F(xiàn)在使用預留的評估數(shù)據(jù)集來驗證這個算法模型。這將會對生成的算法模型的準確度有一個更加直觀的認識?,F(xiàn)在使用全部訓練集的數(shù)據(jù)生成神經(jīng)網(wǎng)絡(ANN)的算法模型,并用預留的評估數(shù)據(jù)集給出一個算法模型的報告。 代碼如下:
#使用評估數(shù)據(jù)集評估算法 ann = MLPClassifier() ann.fit(X=X_train, y=Y_train) predictions = ann.predict(X_validation) print("準確率:",accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))
執(zhí)行程序后,看到算法模型的準確度是0.98。通過混淆矩陣看到只有一個數(shù)據(jù)預測錯誤。最后還提供了一個包含精確率(precision)、召回率(recall)、Fl 值(Fl-score)等數(shù)據(jù)的報告。結果如下:
準確率: 0.9777777777777777 [[20 0 0] [ 0 13 1] [ 0 0 11]] precision recall f1-score support 0 1.00 1.00 1.00 20 1 1.00 0.93 0.96 14 2 0.92 1.00 0.96 11 accuracy 0.98 45 macro avg 0.97 0.98 0.97 45 weighted avg 0.98 0.98 0.98 45
到這里已經(jīng)完成了第一個機器學習項目。這個項目包含從數(shù)據(jù)導入到生成模型,以及通過模型對數(shù)據(jù)進行分類的全部過程。通過這個項目我們熟悉了機器學習項目中的各個步驟。接下來將介紹在本文中用到的對數(shù)據(jù)進行處理分析的技巧和算法,以及改進算法的實踐。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結構數(shù)據(jù)特征價值的專業(yè)核心 表結構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結構數(shù)據(jù)(以 “行 - 列” 存儲的結構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結構數(shù)據(jù)價值的核心操盤手 表格結構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10