這是菜鳥學Python的粉絲第11篇原創投稿
閱讀本文大概需要5分鐘
本篇作者:倩倩同學
如果你正在尋找一個數據集,打算用它來上手學習的機器學習的算法,我想鳶尾花數據集應該是一個不錯的選擇. 本篇文章的數據來自大名鼎鼎的Kaggle,綜合運用了Python的很多可視化庫, 質量非常高!下面就看一下美女倩倩同學是如何研究分析這個數據集的~~
要點:
用到的庫:
pandas,matplotlib,seaborn,sklearn
工具:
Pycharm/Spyder
Python:3.6
數據來自大名鼎鼎的Kaggle網站,裡面有很多好玩的數據集. 下面就是Iris數據:
Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa(山鳶尾),Versicolour(雜色鳶尾),Virginica(維吉尼亞鳶尾))三個種類中的哪一類。
這個數據集,僅有150行,5列。該數據集的四個特徵屬性的取值都是數值型的,他們具有相同的量綱,不需要你做任何標準化的處理,第五列為通過前面四列所確定的鳶尾花所屬的類別名稱。
這裡需要說明的一點是,大家可能比較熟悉用matplotlib來作圖,很少用到seaborn,seaborn其實是在matplotlib的基礎上進行了更高級的API封裝
從而使得作圖更加容易,要注意的是一旦導入了seaborn,matplotlib的默認作圖風格就會被覆蓋成seaborn的格式,seaborn相比於matplotlib擁有更好的默認風格
它繪製的圖表比matplotlib繪製的好看,並且可以繪製比matplotlib默認的圖表更加深入的圖表
導入了相關的包,下面我們就可以加載數據了
>>
數據集的相關信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
花萼長度 150 non-null float64
花萼寬度 150 non-null float64
花瓣長度 150 non-null float64
花瓣寬度 150 non-null float64
所屬種類 150 non-null object
dtypes: float64(4), object(1)
memory usage: 5.9+ KB
None
數據集的維度:
(150, 5)
數據集的隨機10行數據:
花萼長度 花萼寬度 花瓣長度 花瓣寬度
106 4.9 2.5 4.5 1.7 Iris-virginica
128 6.4 2.8 5.6 2.1 Iris-virginica
8 4.4 2.9 1.4 0.2 Iris-setosa
43 5.0 3.5 1.6 0.6 Iris-setosa
24 4.8 3.4 1.9 0.2 Iris-setosa
139 6.9 3.1 5.4 2.1 Iris-virginica
115 6.4 3.2 5.3 2.3 Iris-virginica
129 7.2 3.0 5.8 1.6 Iris-virginica
70 5.9 3.2 4.8 1.8 Iris-versicolor
95 5.7 3.0 4.2 1.2 Iris-versicolor
數據集的特徵屬性:
花萼長度 花萼寬度 花瓣長度 花瓣寬度
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
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
鳶尾花所屬種類的分布:
所屬種類
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
dtype: int64
這裡我們加載數據集是通過目標網址加載的,加載的數據集沒有列名,所以我們通過names給數據集加上了列名:
第一列表示的「花萼長度」
第二列表示的是「花萼的寬度」
第三列表示的是「花瓣的長度」
第四列表示的是「花瓣的寬度」
當然,你也可以直接把數據集下載到自己的電腦上,通過read_csv()讀取本地目錄中的數據集
通過觀察運行結果我們可以發現該數據集的維度的確是(150,5),前四列屬性特徵均為數值型數據,最後一列則表示的是鳶尾花所屬類別
通過觀察數據集的統計特徵,我們可以大致了解四個屬性特徵的取值情況。我們通過鳶尾花所屬類別的分布可以發現在數據集中三種鳶尾花分別佔了50行,他們的分布是很均勻的
下面我們可以通過數據的可視化加深你對數據集的了解
如果說通過單個變量的可視化圖表可以讓我們更好的了解每個屬性的大致情況,那麼通過多變量的可視化圖表則可以讓我們更好的了解屬性對之間的相互關係。
下面我們分別通過pandas自帶的plot(),hist()繪製單個變量的箱線圖和柱狀圖,並通過scatter——matrix繪製描述屬性對兩兩之間的相關性的散點圖。
>>
通過觀察運行結果我們可以對屬性的取值有一個直觀的了解,你可能已經發現在柱狀圖中有兩個屬性的分布好像服從於正態分布,
這對於我們後面利用這個假設去使用算法是很有用的,第三幅圖展示了屬性對之間的相關性,
我們知道如果散點圖上沿著一條「瘦」直線排列,則說明這兩個變量強相關,如果這些點形成一個球形,則說明不相關。
下面我們試著通過sns.pairplot(dataset,hue="所屬種類",size=3)來替換scatt.matrix(dataset),看看他們的顯示有什麼區別:
通過上面這幅圖我們會發現它比之前運用scatter_matrix()繪製圖表的更加直觀,因為我們可以通過顏色來查看鳶尾花所屬的種類.
這裡我們將對比六種不同的模型,看看它們在鳶尾花數據集上的性能表現如何,當我們不知道哪個一算法運用到該問題上比較好,也不知道如何調節參數會使得模型的性能更好時
我們可以通過可視化數據集的結果幫助我們選擇一些合適的算法,下面我們將會嘗試著運用以下六種算法,去評估它們在鳶尾花數據集上的性能表現。
邏輯回歸模型:Logistic Regressin(LR)
線性判別分析模型:Linear Discriminant Analysis(LDA)
K近鄰分析模型:K-Nearest Neighbors(KNN)
分類回歸樹模型:Classification and Regression Tree(CART)
樸素貝葉斯的高斯模型:Gaussian Naive Bayes(NB)
支持向量機分類模型:Support Vector Machines(SVM)
1).拆分數據集
這裡面我們將數據集中的80%用作訓練集,20%用作測試集,設置隨機數種子seed=7
當我們運用機器學習算法使用隨機過程時,先設置一個隨機種子是一個很好的習慣,這樣就可以運行相同的代碼多次,還能保證得到相同的結果,而且當你需要證明結果,使用隨機數據比較算法或調試代碼時,設置隨機數種子也是很有用的
2).抽查算法
>>
邏輯回歸:0.966667(0.040825)
線性判別分析:0.975000(0.038188)
K近鄰:0.983333(0.033333)
分類回歸樹:0.966667(0.040825)
樸素貝葉斯的高斯模型:0.975000(0.053359)
支持向量機:0.991667(0.025000)
這裡我們通過上面提到的六種算法構建了六種不同的分類模型,並設置了通過10折交叉驗證以準率性這一指標來評估模型性能。我們可以看到運行結果中冒號前面是指我們採用的哪種分類算法構建的模型,冒號後面的第一個數字指的是10折交叉驗證得到的準確率結果的一個平均值,而括號中的值代表的是準確性的一個標準差
3).運用模型預測未知數據
我們通過上面的運行結果可以發現鳶尾花數據集在支持向量機上的表現是最好的,下面我們將運用支持向量機這個模型來對我們的測試集進行預測,並在測試集上評估模型的性能
>>
測試集上預測的準確性:
0.933333333333
測試集上混淆矩陣:
[[ 7 0 0]
[ 0 10 2]
[ 0 0 11]]
測試集上的預測結果報告:
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 7
Iris-versicolor 1.00 0.83 0.91 12
Iris-virginica 0.85 1.00 0.92 11
avg / total 0.94 0.93 0.93 30
結論:
通過觀察運行結果我們可以發現支持向量機模型在測試集上的準確度大約為93.3%,模型將兩個雜色鳶尾花,錯誤的判斷為了維吉尼亞鳶尾花。在這裡我們並沒有對模型進行調優,都是用的是默認參數,後期可以通過調節參數,提升模型的性能,達到更好的預測效果.
另外:需要本篇源碼,請留言
來源 | 菜鳥學Python
作者 | xinxin
本文章為菜鳥學Python獨家原創稿件,未經授權不得轉載