
上一篇文章中介紹了機器學習的簡單知識,還有python中進行機器學習實踐需要的生態環境,接下來將會通過鳶尾花分類這個例子對機器學習做一個簡要的介紹。通過一步一步地實現這個項目來介紹以下內容。
可以說這并不是一個正式的項目,只是用來做一個簡單的展示,用于給初次接觸機器學習的讀者快速了解機器學習的過程和結果。
學習編程時,往往我們的第一句代碼就是print(“Hello World”),而接下來的這個數據集,可以說得上是機器學習中的Hello World頂目,入門學習機器學習的過程中最常見的一個數據集。
這個項目是針對鳶尾花(Iris Flower)進行分類的一個項目,數據集是含鳶尾花的三個亞屬的分類信息,通過機器學習算法生成一個模型,自動分類新數據到這三個亞屬的某一個中。項目中使用的鳶尾花數據集是一個非常容易理解的數據集,這個數據集具有以下特點:
接下來我們將通過這個例子一步步地來展示一個機器學習項目的簡化步驟。我們將按照下面的步驟實現這個項目 :
(1)導入數據。
(2)概述數據。
(3)數據可視化。
(4)評估算法。
(5)實施預測。
在整個項目的過程中,最好嘗試自己輸入每一行代碼,以加深對機器學習項目流程的理解。
導入項目所需的各種數據處理、數據可視化以及機器學習相關庫和鳶尾花(Iris Flower)數據集。
導入在項目中將要使用的類庫和方法 。 代碼如下 :
# 導入類庫 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
所有類庫的導入都不應有錯誤提示。如果出現了錯誤提示,那么暫時停下來,先設置一個能夠運行的SciPy環境。
在本項目中我們使用的是 UCI 機器學習數據倉庫中的鳶尾花(Iris Flower)數據集(
http://archive.ics.uci.edu/rnl/datasets/Iris),不需要下載,可以通過sklearn模塊中datasets導入數據直接使用。在這里將使用Pandas來導入數據和對數據進行描述性統計分析,并利用 Matplotlib實現數據可視化。需要注意的是,在導入數據時,為每個數據特征設定了名稱,這有助于后面對數據的展示工作,尤其是通過圖表展示數據。 代碼如下:
## 導入數據 import pandas as pd # 導入pandas庫
from sklearn import datasets # 導入sklearn模塊中的datasets,用以導入數據
iris = datasets.load_iris() # 直接導入數據
dataset = pd.DataFrame(data=iris.data,columns=iris.feature_names) # 用DataFrame存放數據
在導入數據之后,我們需要先看一下數據,增加對數據的理解,以便選擇合適的算法。我們將從以下幾個角度來審查數據:
(1)數據的維度。
(2)查看數據自身 。
(3)統計描述所有的數據特征。
(4)數據分類的分布情況。
不要擔心這會需要很多代碼,每一種審查方法只有一行代碼。這些代碼非常有效,在以后的項目中也會用到。
通過查看數據的維度,可以對數據集有一個大概的了解,如數據集中有多少行數據、數據有幾個屬性等。代碼如下 :
#顯示數據維度 print('數據維度: 行 %s,列 %s' % dataset.shape)
將會得到一個具有 150 行數據, 4 個數據特征屬性的結果,執行結果如下:
數據維度: 行 150,列 4
查看數據自身也是一個很好的理解數據的方法,通過查看數據可以直觀地看到數據的特征、數據的類型,以及大概的數據分布范圍等。代碼如下:
# 查看數據的前10行 print(dataset.head(10))
在這里查看前10行記錄,執行結果如下:
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
數據特征的統計描述信息包括數據的行數、中位值、最大值、最小值、均值、四分位值等統計數據信息。我們需要通過這些統計的信息來大致了解數據的情況。配合箱線圖能夠很好了了解數據的分布和數值大小還有異常值情況等,代碼如下:
# 統計描述數據信息 print(dataset.describe())
執行結果如下:
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
接下來看一下數據在不同分類的分布情況,執行程序后得到的將是每個分類數據量的絕對的數值,看一下各個分類的數據分布是否均衡。代碼如下:
# 分類分布情況 target = [x for x in iris.target] for item in set(target): print("{} : {}".format(item,target.count(item)))
這里就是通過前面設定的數據特征名稱來查看數據的 。 執行結果如下:
0 : 50 1 : 50 2 : 50
我們可以看到鶯尾花的三個亞屬的數據各 50 條,分布非常平衡。如果數據的分布不平衡時,可能會影響到模型的準確度。因此,當數據分布不平衡時,需要對數據進行處理,調整數據到相對平衡的狀態。調整數據平衡時有以下幾種方法。
通過對數據集的審查,對數據有了一個基本的了解,接下來將通過圖表來進一步查看數據特征的分布情況和數據不同特征之間的相互關系 。
## 畫圖顯示 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 - 原創\【算法應用】機器學習python應用-簡單機器學習項目實踐\圖片\類別情況.png”
相對于數值而言,數據可視化后就非常直觀,我們可以清晰地了解到數據中的標簽類別個數以及每種類別間的大致比例情況。
單變量圖表可以顯示每一個單獨的特征屬性,因為每個特征屬性都是數字,因此我們可以通過箱線圖來展示屬性與中位值的離散速度,了解數據偏向和異常值情況。 代碼如下:
# 箱線圖 dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) plt.show()
執行結果:
# 直方圖 dataset.hist() plt.show()
在輸出的圖表中,我們看到 separ- length 和 separ-width 這兩個特征比較符合高斯分布。執行結果如圖 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')
執行結果如下所示,對角線上的四副圖是四個特征的分布情況,其意義和前面的直方圖內容的意義是一致的,很明顯看出 separ- length 和 separ-width 這兩個特征是單峰的,比較符合高斯分布;而 petal length 和 petal width是雙峰的。除了對角線外的其他圖則是散點圖的形式,它們表示的是不同特征間的相關性,從圖中我們可以看出 petal length 和 petal width這兩個特征間有著明顯的線性相關性。如果是回歸模型中,出現多重共線性的特征是需要進行處理的,但我們目前只是簡單的展示一下分類機器學習的大致流程,所以就沒必須做處理了。
一般在機器學習的項目中,數據清洗、數據處理就占去了整個項目的80%的工作量,所以這是機器學習項目中非常重要的一個環節,但在本項目中,iris的數據已經是非常完善的,不需要再進行過多的數據處理過程。如此我們只需要簡單處理一下原數據,使其更適合在某些有特殊要求的算法上使用。
不同的算法對數據也有不同的要求,比如KNN算法,因為一般是基于歐式距離進行計算,所以也要求數據必須要做標準化,否則建模過程中大小不一的特征的實際權重也會不同,數值較大的特征將會覆蓋掉數值較小的特征。為了解決這中影響,我們可以將數據標準化,執行代碼如下:
# 標準化處理
from sklearn import preprocessing
#建立StandardScaler對象 std = preprocessing.StandardScaler()
data_std = std.fit_transform(dataset)
模型被創建后需要知道創建的模型是否足夠好。在選擇算法的過程中會采用統計學方法來評估算法模型。但是,我們更想知道算法模型對真實數據的準確度如何,這就是保留一部分數據來評估算法模型的主要原因。下面將按照70%的訓練數據集,30%的評估數據集來分離數據。代碼如下:
# 分離數據集 ## 原數據 X_train, X_validation, Y_train, Y_validation = train_test_split(dataset, target, test_size=0.3, random_state=12) ## 標準化數據 X_train_std, X_validation_std, Y_train, Y_validation = train_test_split(data_std, target, test_size=0.3, random_state=12)
現在就分離出了 X_train 和 Y_train 或者標準化后的X_train_std和Y_train用來訓練算法創建模型, x_validation(X_validation_std)和Y_validation 在后面會用來驗證評估模型。
通過不同的算法來創建模型,并評估它們的準確度,以便找到最合適的算法。將按照下面的步驟進行操作:
(1)采用 10 折交叉驗證來評估算法模型 。
(2)生成幾個常用的分類模型來預測新數據 。
(3)選擇最優模型
在這里將通過 10 折交叉驗證來分離訓練數據集,并評估算法模型的準確度。10 折交叉驗證是隨機地將數據分成 10 份,9 份用來訓練模型,1 份用來評估算法。后面我們會使用相同的數據對每一種算法進行訓練和評估 , 并從中選擇最好的模型。
對任何問題來說,不能僅通過對數據進行審查,就判斷出哪個算法最有效。通過前面的圖表,發現有些數據特征符合線性分布,所有可以期待算法會得到比較好的結果 。
接下來評估六種不同的算法:
這個算法列表中包含了線性算法(LR)和非線性算法(ANN、KNN 、CART、NB和SVM)。在每次對算法進行評估前都會重新設置隨機數的種子,以確保每次對算法的評估都使用相同的數據集,保證算法評估的準確性。接下來就創建并評估這六種算法模型。代碼如下:
# 算法審查
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('原數據:%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('標準化數據:%s: %f (%f)' %(key, cv_results.mean(), cv_results.std()))
現在已經有了六種模型,并且評估了它們的精確度。接下來就需要比較這六種模型,并選出準確度最高的算法。執行上面的代碼,結果如下 :
原數據:LR: 0.933636 (0.062463)
原數據:ANN: 0.972727 (0.041660)
原數據:KNN: 0.972727 (0.041660)
原數據:CART: 0.914545 (0.066953)
原數據:NB: 0.933636 (0.062463)
原數據:SVM: 0.963636 (0.060302)
標準化數據:LR: 0.887273 (0.069734)
標準化數據:ANN: 0.942727 (0.064801)
標準化數據:KNN: 0.942727 (0.046895)
標準化數據:CART: 0.914545 (0.066953)
標準化數據:NB: 0.933636 (0.062463)
標準化數據:SVM: 0.951818 (0.065813)
通過上面的結果,可以看出實際上用原數據進行建模的結果反而更好,說明這份數據不需要再更變動了。然后6種算法中神經網絡和KNN算法的準確率最高,這種情況下怎么辦,該如何確定哪個才是更好的。接下來創建一個箱線圖,通過圖表來比較算法的評估結果。 代碼如下 :
# 箱線圖比較算法 fig = plt.figure() fig.suptitle('Algorithm Comparison') ax = fig.add_subplot(111) plt.boxplot(results) ax.set_xticklabels(models.keys()) plt.show()
執行結果:
我們可以看出,雖然總體的平均準確率和標準差是一樣的,但是ANN算法的中值相對KNN的更高,說明ANN算法的相對來說會更好一點。
評估的結果顯示,神經網絡(ANN) 是準確度最高的算法?,F在使用預留的評估數據集來驗證這個算法模型。這將會對生成的算法模型的準確度有一個更加直觀的認識?,F在使用全部訓練集的數據生成神經網絡(ANN)的算法模型,并用預留的評估數據集給出一個算法模型的報告。 代碼如下:
#使用評估數據集評估算法 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))
執行程序后,看到算法模型的準確度是0.98。通過混淆矩陣看到只有一個數據預測錯誤。最后還提供了一個包含精確率(precision)、召回率(recall)、Fl 值(Fl-score)等數據的報告。結果如下:
準確率: 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
到這里已經完成了第一個機器學習項目。這個項目包含從數據導入到生成模型,以及通過模型對數據進行分類的全部過程。通過這個項目我們熟悉了機器學習項目中的各個步驟。接下來將介紹在本文中用到的對數據進行處理分析的技巧和算法,以及改進算法的實踐。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《劉靜:10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda ...
2025-04-23