1. 程式人生 > >UCI庫中Mines vs. Rocks的資料集屬性視覺化展示

UCI庫中Mines vs. Rocks的資料集屬性視覺化展示

資料集描述: 從各種不同的縱橫角度獲得的訊號,每個樣本有60個從不同地點接收到的儀器測量值(每個模式是一組60個數字,範圍為0.0到1.0),最後一個標記岩石(R)和水雷(M) 任務是根據聲納返回的測量資訊,進行分類,從而發現未爆炸的水雷。

data_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data"
dataset = pd.read_csv(data_url,prefix='x')   #shape(207, 61)
dataset.head()
dataset.tail()
summary = dataset.describe()
print(summary)

輸出:(部分) 這裡寫圖片描述 在這裡可以觀察不同分位數之間的差異。對於同意屬性,如果存在某一個差異嚴重異於其他差異,則說明存在異常點。這就值得進一步分析資料。

手段①:平行座標圖 用於多個屬性問題的視覺化,對於一個二分類問題(本例),橫軸對應著每個樣本的所有屬性,縱軸代表著標籤值。 在水平座標圖中,每個樣本都對應著一條折線(橫軸為每個觀測值的對應點,刻度可以是x1,x2,x3,代表變數1,2,3…) Mines vs. Rocks資料集的水平座標圖:

#這裡對不同標籤的樣本的折線進行了顏色區分。R標籤樣本為紅色折線,藍色為雷的樣本
plt.figure(figsize=(10,6))
for
item in range(207): if dataset.iat[item,60] == 'R': pcolor = 'red' else: pcolor = 'blue' example = dataset.iloc[item,0:60] plt.plot(example,color = pcolor) plt.xlabel('example',fontsize = 20) plt.xticks([]) plt.ylabel('value',fontsize = 20) plt.show()

這個圖的橫軸應該有60個值的,分別對應著60個變數(各個屬性值位於0~1之間),用All variables代替 這裡寫圖片描述

這個資料集並不能很好的區分類別。著名的’鳶尾花資料集‘就可以很明顯的區分出不同類別。

手段②:交會圖 可以展示資料間關係的密切程度 Mines vs. Rocks資料集屬性對間的交會圖

#這裡是1號樣本資料的屬性跟2號樣本的屬性之間的關係
example1 = dataset.iloc[1,:60]
example2 = dataset.iloc[2,:60]
plt.scatter(example1,example2)
plt.xlabel('example_x1')
plt.ylabel('example_x2')
plt.show()

輸出: 這裡寫圖片描述

#這裡是2號樣本資料的屬性跟30號樣本的屬性之間的關係
example = dataset.iloc[2,:60]
example30 = dataset.iloc[30,:60]
plt.scatter(example2,example30)
plt.xlabel('example_x2')
plt.ylabel('example_x30')
plt.show()

輸出: 這裡寫圖片描述 基本上交會圖上的點如果聚集在一條’線‘則說明相關性高,相關性不高的交會圖上的點可能會擴散一些呈’球形‘ 上述例子的小結論: 由於聲納的特性從低頻到高頻的變化,樣本資料依據時間獲取的,我們猜想,相隔的樣本之間的相關程度可能高於間隔大樣本,上面的兩個圖也證實了我們的猜想,第一個圖為樣本1,2之間的交會圖,相關程度比樣本2,30程度來得要高。 應用同樣的原則,我們可以畫出任意一個指定的變數跟最終目標的交會圖,從而得出哪些變數跟最終目標相關程度

分類標籤和實數值屬性之間的相關性: 這裡需要進行一點處理,就是對於標籤,M ,R為類別變數,需要進行轉化。

#轉化程式碼  1表示標籤為岩石,0表示標籤為雷
from sklearn.preprocessing import LabelEncoder
LE = LabelEncoder()
target = dataset.iloc[:,60]
target = LE.fit_transform(target)
#取30號變數研究其與最終目標的相關性
x_30 = dataset.iloc[:,30]
plt.figure(figsize=(15,6))
plt.scatter(x_30,target)
plt.xlabel('x_30')
plt.ylabel('label')

輸出: 這裡寫圖片描述 由於是個二分問題,這裡取變數30的中值為界,x_30小於0.5,下方資料比較密集,x_30大於0.5,上方資料比較密集。 得出的一點小結論: 這裡可以構造一個很粗略的分類器,即:對於x_30小於0.5的樣本,我們歸類於M,大於0.5歸類於R。這樣我們可以得到一個略微比隨即預測要好的分類器。當然這作為最終結果太爛了。但是,別忘了,我們只取了諸多變數中的一個1/60得到的這個分類器。                                                                                                                                        未完待續。。。