數據科學Python——從零開始

在本文中,我們將研究數據可視化以及它如何揭示數據最深刻和最黑暗的秘密。接下來,我們將構建我們的第一個機器學習模型,以便了解到底它到底是什麼!

I.數據可視化

在數據科學中,如果您有1000行數據和大量的列。想象一下,如果您必須瀏覽每條記錄並瞭解它在該數據集中的重要性,那將是多麼可怕的。但是,如果您將數據可視化或繪製成最適合的圖表,則可以在一秒鐘內獲得每個數據點的重要性。

Matplotlib

Matplotlib是一個可用於python平臺的數據可視化庫。它以柱狀圖,直方圖,箱形圖和其他幾個基本圖表的形式提供2D表示。我們還有許多其他更好的庫,如Plotly,Bokeh,為您提供誘人的表現形式。但要理解matplotlib中的基礎知識,然後才能逐漸掌握其他的。

1、折線圖:

我認為可視化實際數據比虛擬數據更有意義。為此,我使用了Kaggle 的Crime in India數據集。折線圖是2D表示,顯示了一個變量相對於另一個變量的趨勢。

數據科學Python——從零開始

折線圖

 import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
data = pd.read_csv('datasets/10_Property_stolen_and_recovered.csv')
#Extract the delhi row and pivot it based on Year and Cases of Property stolen
line = data[data['Area_Name']=='Delhi'].pivot_table(index='Year',values='Cases_Property_Stolen')
#plot the line variable
plt.plot(line)
plt.xlabel('Year')
plt.ylabel('Number of Property Stolen Cases in Delhi')
plt.show()
數據科學Python——從零開始

Matplotlib.pyplot庫存儲看起來像Matlab的方法。在matplotlib.pyplot中,關於繪圖圖形(這裡是plt)和繪圖區域保留了某些狀態。任何可能使用的進一步方法都假定是針對這個特定的圖本身的。

  • plt.plot()函數的作用是繪製X-Y軸上的點。
  • 給出了x軸和y軸標籤。
  • 最後,我們使用show()函數在控制檯上顯示圖表並將命令返回給IPython shell。

2、柱狀圖

數據科學Python——從零開始

柱狀圖

柱狀圖柱狀圖用於顯示分類變量的頻次或度量。

#produce a dataframe where in rows only Dacoity exits
x = data[data.loc[:,'Sub_Group_Name']=='1. Dacoity']
# make a pivot_table where names of States are mentioned alongside the total number of propert stolen cases
bar = x.pivot_table(index='Area_Name',values='Cases_Property_Stolen',aggfunc=np.sum)
#select random set of index
index=bar[5:10].index
#enlarge the figure size
plt.figure(figsize=(9,5))
#plot the bar chart
plt.bar(index,bar.Cases_Property_Stolen[5:10],width=0.5)
#set xlabels and ylabels
plt.ylabel('Number of property stolen')
plt.xlabel('States in India')
#set the title
plt.title('Dacoity from 2001- 2010')
plt.show()
數據科學Python——從零開始

在matplotlib.pyplot中,我們使用bar()方法來構建圖表。bar方法需要兩個必需參數,一個是x軸標籤,另一個是這些標籤的高度。

3、餅狀圖:

數據科學Python——從零開始

數據科學Python——從零開始

餅狀圖

餅狀圖上面的柱狀圖很棒,但我們無法弄清楚記錄的案件中有多少比例屬於哪個地方。就此而言,為了清楚地瞭解我們構建餅狀圖的每個地區的百分比。

plt.figure(figsize=(6,6))
#pie() method
plt.pie(bar.Cases_Property_Stolen[5:10],labels=index,autopct='%1.1f%%',shadow=True, startangle=90)
#equal axis ensures that we get a perfect circle
plt.axis('equal')
plt.title("DACOITY CASES RECORDED(2000 - 2010)")
plt.show()
數據科學Python——從零開始

這裡,pie()方法必須需要兩個參數,一個是標籤,第二個是將分配給該特定標籤的大小或角度。autopct屬性用於為餅狀圖的扇形提供標籤。

4、散點圖:

數據科學Python——從零開始

散點圖

散點圖散點圖用於檢查變量的分佈或變量之間的關係。因此,我們需要在x軸和y軸上繪製至少2個字段。我使用了一個隨機數生成器,它只是分配一種顏色。

plt.figure(figsize=(16,9))
#depict random colors
colors = np.random.rand(35)
#prepare a pivot table for representations
scatter = data.pivot_table(index='Area_Name',values=['Cases_Property_Stolen','Value_of_Property_Stolen','Value_of_Property_Recovered'],aggfunc=np.sum)
#plot the scatterpoints
plt.scatter(scatter.Cases_Property_Stolen,scatter.Value_of_Property_Stolen,c=colors)
plt.xlabel('Number of Property Stolen cases')
plt.ylabel('Value of Property Stolen')
plt.show()
數據科學Python——從零開始

5、直方圖:

直方圖是查看變量分佈的好方法。bin或bucket的概念非常重要,是直方圖。bin大小定義了數據進入“bin”的程度。比如bin大小是10,所以表示將是0-10,10-20,20-30,依此類推。現在假設bin大小為50,表示為0-50,50-100等。

數據科學Python——從零開始

直方圖

直方圖我們可以解釋大多數案件是搶劫少於約2000件物品。

plt.figure(figsize=(16,9))
#draw a hist with say 35 bins
plt.hist(data.Cases_Property_Stolen,bins=35)
#provide labels
plt.xlabel("Bins bases on quantity of property stealth")
plt.ylabel("Count")
plt.axis([0,50000,0,3000])
plt.show()
數據科學Python——從零開始

6、箱形圖:

Boxplot用於繪製變量的分佈並檢測其異常值。所有異常值都以圓圈表示。雖然矩形框表示數據的最大集中位置,但它還指出了最小值,最大值和四分位數間距以及一條實際上是中值的線。

數據科學Python——從零開始

箱型圖

箱形圖該箱型圖表示數據嚴重偏斜,同時存在多個異常值。這正是直方圖所傳達的,但是以不同的表示形式。在這裡,我們清楚地瞭解了異常值及其數量,但直方圖中的圖像並不一樣。

plt.figure(figsize=(16,9))
plt.boxplot(data.Cases_Property_Recovered)
plt.ylabel("Count")
plt.show()

據我所知,箱型圖和直方圖都可以用來考慮變量的分佈。這取決於你決定選擇哪一個!

現在,瞭解這些少數圖表就足夠了。

II、機器學習:

我們已經獲得了關於python的原始知識以及我們如何使它為我們工作。

什麼是機器學習?

讓我們回到20世紀50年代,你是一個受歡迎和有才華的演員的私人助理。現在這位著名的名人收到了成千上萬封來信,來自他的粉絲、崇拜者、導演、製片人、廣告公司、演員夥伴等等。現在名人忙著做他的工作,而你的工作是在午餐時間給他帶來所有重要和緊急的信件。所以你整個上午都在瀏覽和閱讀一堆信件,把不重要的信息給那位大人物過濾掉。就在那時你嘆了口氣說:“我希望我有一根魔杖可以自己把這些信息給分類出來”。

快進60年,那魔杖就是今天的機器學習。雖然建立一個機器學習模型並不像轉動魔杖那麼容易,但如果做得好,結果確實是神奇的!

回到技術性,機器學習是自動處理大量數據,從數據中學習並從中產生有價值的東西。

考慮一個電子郵件垃圾郵件過濾程序,它可以阻止包含“購物”一詞的所有電子郵件。我們開發了一種機器學習算法,可以將這些信息直接扔進垃圾箱。但是,我也可以寫一個簡單的IF-THEN語句並完成我的工作。為什麼要炫耀機器學習?

機器學習正在使一個系統或機器像人類一樣思考,這樣人類就不必浪費時間從其收件箱中過濾出愚蠢的垃圾郵件。

在現實生活中,數據從未如此分類和精確。每組新數據都存在驚人的變異程度。我們人類有智慧將相關與不相關的東西分開。我們試圖將這種智能複製到機器學習模型中。機器學習模型逐漸發展並嘗試從他們獲得的每種新數據模式中學習。

機器學習的類型:

1、監督學習 -簡單地說它是在和老師學習。

你的老師教一朵花的結構; 什麼是花冠,什麼是花萼、花瓣等。你學習並編寫測試。老師檢查答案並告訴你你的表現如何。她監督著你。同樣,在監督學習中,我們已經知道給定輸入變量集的結果變量是什麼。我們必須在輸入數據上訓練模型,以便產生所需的目標。該模型不斷學習和適應,直到達到近乎完美的結果。

2、無監督學習:沒有老師的學習。

您是否注意到“您可能也喜歡......”部分?這是無監督學習的一個有力例子。這裡的學習沒有老師,它被用來挖掘隱藏在黃金數據礦中的黃金。因此,當您從網上購買白板時,它會運行一個模型,該模型會自動將所有其他相關對象(如筆,板擦和其他)聚集到一起為你推薦。如果購買對象也發生變化,這些建議會迅速改變,對吧?看,模型還不知道推薦是洗碗機還是空調,它只是學習並提供結果。

3、Scikit-learn

Scikit-learn是一個開源庫,包含幾種方法,可以讓我們對給定的數據上進行機器學習。它依賴於SciPy和NumPy庫,所以在開始使用之前要加載所需要的庫。雖然在安裝Anaconda時安裝了sklearn,但如果您遇到任何問題,可以在Python中直接使用

pip install sklearn

我們將研究iris數據集,以獲得更多關於scikit-learn的實踐經驗。我保證,在我們學習的過程中,你會學到所有必要的術語以及它們的含義。

想象一下,有一位充滿激情的植物學家,她喜歡收集鳶尾花。因此,她每天早晨都會進入野外,在她漫步時,她會收集所有可能的鳶尾花。然後,當她回到家時,她測量花瓣的長度和寬度,以及萼片的長度和寬度。基於這四種長度,她將收集的花朵區分為三種:Setosa,Versicolor或Virginica。這意味著給定一組輸入測量值,我們的植物學家就可以確定它可能屬於哪種物種。讓我們假設只有這三個類在野外可用。

我們的任務是建立一個機器學習模型,可以根據測量結果正確地告訴我們花的種類。由於我們已經知道輸出將是三類鳶尾花之一,這是一個監督學習問題。此外,它是一個分類問題,因為您看到我們正在將給定的花分類為預定義的類(種類)。更準確地說,這是一個三級分類問題。讓我們滿足數據:

1、導入所有必要的庫,如下所示:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

2、導入鳶尾花數據集:由於數據集本身不提供列標題,我們首先將列標籤放在名為columns的列表中,然後使用read_csv函數加載數據集以及剛剛聲明的列。

columns=['sepal length in cm', 'sepal width in cm','petal length in cm','petal width in cm' ,'class']
data = pd.read_csv("datasets/iris.data",names=columns)
數據科學Python——從零開始

3、瞭解數據:

好的,我們已經將數據集聲明為花瓣和萼片以及目標類的測量值。但對於外行人來說,花瓣和萼片是什麼?

數據科學Python——從零開始

IRIS類萼片是保護花蕾並保持花瓣位置的葉子。花瓣,正如我們大多數人所知,是修飾的葉子,形成一朵花,圍繞著它的繁殖部分。至於鳶尾花,這些長度決定了它們所屬的種類。

data.shape

(150,5)

shape()方法輸出數據集中的行數和列數。這裡(x,y)其中x是行數,y是列數。

data.describe()
數據科學Python——從零開始

describe()函數告訴我們數值變量的摘要。在這裡我們可以看到每列的數量是150,即。沒有空值。然後我們得到每列的mean,std,min,max……。

4、數據可視化:最後我們使用我們之前學到的東西!

4.1、單變量分析可以更好地理解每個變量。在這裡,我們創建了所有測量的箱型圖。

#create a subplot grid of 2x2 plots with the given size 
fig, ax = plt.subplots(2,2,figsize=(10,8))
ax[0,0].boxplot(data['sepal length in cm'])
ax[0,0].set_title("Sepal length")
ax[0,1].boxplot(data['sepal width in cm'])
ax[0,1].set_title("Sepal width")
ax[1,0].boxplot(data['petal length in cm'])
ax[1,0].set_title("Petal length")
ax[1,1].boxplot(data['petal width in cm'])
ax[1,1].set_title("Petal width")
fig.subplots_adjust(left=0.08, right=0.98, bottom=0.05, top=0.9,
hspace=0.3, wspace=0.2)
plt.show()
數據科學Python——從零開始

  • 箱形圖我們可以看到萼片長度範圍從4到8.0單位,沒有異常值
  • 雖然萼片確實有一些異常值,準確的說是三個異常值。
  • 花瓣長度和寬度沒有異常值。

4.2、多變量分析檢查變量之間的關係。我們使用seaborn包來查看此分析。Seaborn是另一個極好的繪圖包,實際上是基於matplotlib。

import seaborn as sns
sns.set()

pairplot()方法繪製所有給定的4個測量值並嘗試建立它們之間的關係。每次測量都與其他測量結果進行比較。

數據科學Python——從零開始

配對圖從給定的圖表中,我們可以清楚地看到每朵花的測量值集中在特定的數字範圍內。因此,我們可以成功運行分類算法並獲得所需的鳶尾花種類。

5、拆分數據:

在開始針對這些參數構建機器學習模型之前,我們需要一些確認,即我們作為花的“類”生成的任何輸出都是正確的。但從邏輯上講,我們不能使用我們用於訓練模型的相同數據來測試模型。我們需要看不見的新數據,這些數據實際上具有預測的輸出類變量。我們將在這些新數據上運行我們的模型並獲得結果類。

為此,機器學習中的一般規則是在75%的數據上訓練任何模型,稱之為訓練數據或訓練集。其餘25%的數據是測試數據或測試集

from sklearn.model_selection import train_test_split
arr = data.values
X = arr[:,0:4]
y = arr[:,-1]
X_train,X_test,y_train,y_test = train_test_split(X,y, random_state=0)

Python提供了一個內置函數來處理拆分,輸入採用兩個重要參數,即輸入X列和輸出y變量。默認的test_size是0.25,即整個數據的25%是測試數據,我們使用random_state = 0使我們能夠混淆數據,然後隨機選擇分割。假設如果我們將最後25%的數據作為測試數據,我們將只有iris-virginica輸出。這對於訓練來說是極具誤導性的,因此隨機拆分。

Ps:使用大寫X表示輸入變量,小寫y表示結果變量,這只是一種習慣。

6、構建模型:

現在我們轉到最後也是最有趣的一步,即構建機器學習模型來學習這些。

對於此數據集,我們將使用KNN分類模型。

KNN算法: KNN代表K-nearest neighbors(K-最近鄰居)。你是否曾經聽說過這樣一種信念:你的大部分時間都花在和其他人在一起,而你只是他們中的一個!應用此類比來理解KNN算法。KNN考慮給定數據點的鄰居,並根據這些鄰居屬於哪個類,確定給定數據點的類。這個算法中的'K'是我們為分析考慮的鄰居數,比如k = 3告訴使用3個鄰居。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
數據科學Python——從零開始

  • KNN算法屬於名為KNeighborsClassifier的sklearn.neighbors包中。
  • 要使用此算法,我們需要從給定的類中實例化一個對象。我們稱這個對象為'knn'。為簡單起見,我們只使用一個鄰居進行訓練。不要擔心我們將在稍後的工作。
  • 使用fit()方法,我們在訓練集上訓練模型。fit()方法有兩個參數,一個是包含所有測量值的X_train,第二個參數是包含這些測量值的所有標籤的y_train。

但是訓練模型是不夠的,我們需要測試它!

pred = knn.predict(X_test)
print("The model has a accuracy of "+str((knn.score(X_test,y_test)*100)))

The model has a accuracy of 97.36842105263158

使用測試向量X_test,我們在其上部署訓練有素的knn模型。score()方法計算給定測試數據的平均準確度。它採用測試數據點及其測試數據標籤並輸出準確度。對於我們的模型,我們得到了高達97%的精度。您部署了第一個機器學習模型。


分享到:


相關文章: