機器學習之數據分析

熟話說,'巧婦難爲無米之炊',數據和特徵就是'米',模型和算法則是'巧婦',沒有充足的數據、合適的特徵,再強大的模型結構也沒法獲得滿意的輸出,爲了更好的使用模型,必須先對數據有個正確的認識,本博將對數據分析的三種方法(描述性統計,數據可視化和相關性係數)進行總結,爲數據預處理準備python

1. sklearn數據集類型

- 自帶的小數據集:sklearn.datasets.load_<name>

    鳶尾花數據集:load_iris()

    乳腺癌數據集:load_breast_cancer()

    手寫數字集:load_digits()
    
- 可在線下載的數據集:sklearn.datasets.fetch_<name>

- 計算機生成的數據集:sklearn.datasets.make_<name>

- svmlight/libsvm格式的數據集:sklearn.datasets.load_svmlight_file()

- 從買了data.org在線下載獲取數據集:sklearn.datasets.fetch_mldata()

2. 數據分析

下面將以房價數據爲例進行說明這個數據分析過程git

2.1 獲取數據

import pandas as pd
housing = pd.read_csv('./datasets/housing/housing.csv')

2.2 查看列標信息

print(housing.columns)
Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms',
       'total_bedrooms', 'population', 'households', 'median_income',
       'median_house_value', 'ocean_proximity'],
      dtype='object')

2.3 查看數據集前5行信息

print(housing.head())
longitude  latitude  housing_median_age  total_rooms  total_bedrooms  \
0    -122.23     37.88                41.0        880.0           129.0   
1    -122.22     37.86                21.0       7099.0          1106.0   
2    -122.24     37.85                52.0       1467.0           190.0   
3    -122.25     37.85                52.0       1274.0           235.0   
4    -122.25     37.85                52.0       1627.0           280.0   

   population  households  median_income  median_house_value ocean_proximity  
0       322.0       126.0         8.3252            452600.0        NEAR BAY  
1      2401.0      1138.0         8.3014            358500.0        NEAR BAY  
2       496.0       177.0         7.2574            352100.0        NEAR BAY  
3       558.0       219.0         5.6431            341300.0        NEAR BAY  
4       565.0       259.0         3.8462            342200.0        NEAR BAY

2.4 獲取數據集的簡單描述

print(housing.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
longitude             20640 non-null float64
latitude              20640 non-null float64
housing_median_age    20640 non-null float64
total_rooms           20640 non-null float64
total_bedrooms        20433 non-null float64
population            20640 non-null float64
households            20640 non-null float64
median_income         20640 non-null float64
median_house_value    20640 non-null float64
ocean_proximity       20640 non-null object
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
None

注意:total_bedrooms這個屬性只有20433個非空值,這意味着又207個區域缺失這個特徵,全部的屬性的字段都是float,除了ocean_proximity,它的類型是object,所以它能夠是任何類型的Python對象算法

2.5 查看分類標籤種類和數量

print(housing['ocean_proximity'].value_counts())  #查看屬性類別
<1H OCEAN     9136
INLAND        6551
NEAR OCEAN    2658
NEAR BAY      2290
ISLAND           5
Name: ocean_proximity, dtype: int64

2.6 查看數據集統計描述信息

print(housing.describe()) #查看描述性信息
longitude      latitude  housing_median_age   total_rooms  \
count  20640.000000  20640.000000        20640.000000  20640.000000   
mean    -119.569704     35.631861           28.639486   2635.763081   
std        2.003532      2.135952           12.585558   2181.615252   
min     -124.350000     32.540000            1.000000      2.000000   
25%     -121.800000     33.930000           18.000000   1447.750000   
50%     -118.490000     34.260000           29.000000   2127.000000   
75%     -118.010000     37.710000           37.000000   3148.000000   
max     -114.310000     41.950000           52.000000  39320.000000   

       total_bedrooms    population    households  median_income  \
count    20433.000000  20640.000000  20640.000000   20640.000000   
mean       537.870553   1425.476744    499.539680       3.870671   
std        421.385070   1132.462122    382.329753       1.899822   
min          1.000000      3.000000      1.000000       0.499900   
25%        296.000000    787.000000    280.000000       2.563400   
50%        435.000000   1166.000000    409.000000       3.534800   
75%        647.000000   1725.000000    605.000000       4.743250   
max       6445.000000  35682.000000   6082.000000      15.000100   

       median_house_value  
count        20640.000000  
mean        206855.816909  
std         115395.615874  
min          14999.000000  
25%         119600.000000  
50%         179700.000000  
75%         264725.000000  
max         500001.000000

3. 數據可視化

數據可視化能夠經過各類圖表顯示,如直方圖、點圖、箱體圖、QQ圖,下面以longitude屬性爲例fetch

3.1 點圖

import matplotlib.pyplot as plt
plt.plot(housing.index,housing['longitude'],'r.')
plt.show()

3.2 繪製直方圖

plt.hist(housing['longitude'],bins=20)
plt.show()

3.3 將地理數據可視化

housing.plot(kind='scatter',x='longitude',y='latitude')
<matplotlib.axes._subplots.AxesSubplot at 0x206138f5fd0>

housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.1)
<matplotlib.axes._subplots.AxesSubplot at 0x2061395bc88>

接下來看看房價,每一個圓的半徑大小表明了每一個地區的人口數量(選項s),顏色表明價格(選項c),使用jet的預約義顏色表(選項cmap)來進行可視化,顏色範圍從藍到紅(從低到高)spa

housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.4,s=housing['population']/1000,
            label='population',c='median_house_value',cmap=plt.get_cmap('jet'),colorbar=True)
plt.legend()
<matplotlib.legend.Legend at 0x206139bdc88>

4 查看特徵相關性

因爲數據集不大,可使用corr()輕鬆計算除每隊屬性之間標準相關係數,也稱爲皮爾遜相關係數code

皮爾遜相關係數公式:
\[p_(X,Y) = \frac{cov(X,Y)}{\sigma_X \sigma_Y} = \frac{\sum_{i=1}^n(x_i - \mu)(y_i-\mu)}{\sqrt{\sum_{i=1}^n{(x_i-\mu)}^2\sqrt{\sum_{i=1}^n{(y_i-\mu)}^2}}}\]對象

計算相關性係數時還可使用歐式距離和餘弦類似度,但須要明確它們的使用場景,歐式距離主要關注數值之間的差別,當相對於平均水平偏離度很大時,不能很好的反映真實的類似度,餘弦類似度更偏重於維度之間的差別blog

corr_matrix = housing.corr()
print(corr_matrix['median_house_value'].sort_values(ascending=False))
median_house_value    1.000000
median_income         0.688075
total_rooms           0.134153
housing_median_age    0.105623
households            0.065843
total_bedrooms        0.049686
population           -0.024650
longitude            -0.045967
latitude             -0.144160
Name: median_house_value, dtype: float64

相關係數的範圍從-1變換到1,越接近1,表示越強的正相關,越接近-1,表示越強烈的負相關,係數靠近0時說明兩者之間沒有線性相關性。get

\({\color {red} {注意,相關係數僅測量線性相關性,因此它有可能完全遺漏非線性相關性}}\)數據分析

附:變異值度量

極差

極差 = 最大值 - 最小值

樣本方差

n個測量值\(x_1,x_2,...,x_n\)的樣本方差定義爲\[s^2 = \frac{1}{n-1}\sum_{i=1}^n{(x_i - \mu)}^2\]

注意:有偏方差和無偏方差的區別

標準方差

\[s = \sqrt{s^2}\]

解釋標準差的兩個有效法則:經驗法和切比雪夫法則

經驗法則

若一個數據集有近似丘形的對稱分佈,則能夠用如下的經驗法則描述數據集

(1)大約68%的測量值位於均值的1個標準差範圍內(\(即對於樣本在區間\mu\pm s範圍內,對於整體在區間\mu\pm \sigma範圍內)\)

(2)大約95%的測量值位於均值的2個標準差範圍內(\(即對於樣本在區間\mu\pm 2s範圍內,對於整體在區間\mu\pm 2\sigma範圍內)\)

(3)幾乎全部測量值位於均值的2個標準差範圍內(\(即對於樣本在區間\mu\pm 3s範圍內,對於整體在區間\mu\pm 3\sigma範圍內)\)

切比雪夫法則

對於任一數據集,不管數據的頻數是什麼形狀

(1)可能不多的測量值落在均值的1個標準差範圍內(\(即對於樣本在區間\mu\pm s範圍內,對於整體在區間\mu\pm \sigma範圍內)\)

(2)至少有\(\frac{3}{4}\)的測量值落在均值的2個標準差範圍內(\(即對於樣本在區間\mu\pm 2s範圍內,對於整體在區間\mu\pm 2\sigma範圍內)\)

(3)至少有\(\frac{8}{9}\)的測量值落在均值的3個標準差範圍內(\(即對於樣本在區間\mu\pm 3s範圍內,對於整體在區間\mu\pm 3\sigma範圍內)\)

(4)一般,對於任意大於1的數k,至少有\(1-\frac{1}{k^2}\)的測量值落在均值的k個標準差範圍內

相關文章
相關標籤/搜索