神經網路在多分類上的應用 資料預處理

2022-09-13 20:24:18 字數 4456 閱讀 2433

標籤: 神經網路 多分類

目錄訓練資料集和測試資料集的劃分

主要工具:pandasmatplotlibseabornnumpysklearn

feature1

feature2

feature3

feature4

class

5.11400

1.42

04.9

1200

1.42

04.7

1280

1.32

0資料集含有4個特徵每個輸入的x向量有4個座標;每行代表乙個影象;class代表影象的類別:有三種情況——0代表是人,1代表是貓,2代表是狗

使用pandas包讀取data檔案為dataframe格式。

dataset = pd.read_csv('data.csv')
由**可以看出,資料集仍需要進一步處理:

資料集是按類別分類後按順序依次排列的,需要將其打亂。

已知python自帶有shuffle方法,這裡dataset為dataframe格式,可以使用pandas中設定抽取比例為1時的sample方法。

# 打亂後索引仍按照正常的排序

dataset = dataset.sample(frac=1).reset_index(drop=true)

使用matplotlib包和seaborn工具繪製資料圖,直觀分析它們之間的關係和資料的特點。

matplotlib

選取feature1和feature2作為二維影象的橫縱座標;

分別取出類別為人,貓和狗時的二維特徵陣列;

分別繪製不同顏色的散點圖,注意這三種類別的資料點應該體現在一張二維影象上。

**如下:

def plot_points(dataset):

x = np.array(dataset[["feature1", "feature2"]]) # x儲存特徵,先繪製二維圖(選取feature1和feature2)

y = np.array(dataset["class"]) # y儲存類別

people = x[np.argwhere(y == 0)] # 取出為人時的特徵值陣列

cat = x[np.argwhere(y == 1)] # 取出為貓時的特徵值陣列

dog = x[np.argwhere(y == 2)] # 取出為狗時的特徵值陣列

# 對於類別為人,貓,狗,分別繪製不同顏色的資料點——對應於同一張二維座標圖

plt.scatter([s[0][0] for s in people], [s[0][1] for s in people], s=25, color='red', edgecolor='k')

plt.scatter([s[0][0] for s in cat], [s[0][1] for s in cat], s=25, color='cyan', edgecolor='k')

plt.scatter([s[0][0] for s in dog], [s[0][1] for s in dog], s=25, color='yellow', edgecolor='k')

plt.xlabel('feature_1')

plt.ylabel('feature_2')

plot_points(dataset)

plt.show() # 繪製散點圖

繪製影象如下:

seaborn

使用seaborn中的pairplot函式繪製多變數圖——如本專案中特徵有四個維度;

若pairplot的變數引數有n個,則會繪製n*n的方格。當i=j時,為直方圖;i≠j時,為散點圖;

仍然使用matplotlib的顯示函式來顯示影象。

**如下:

import seaborn as sns  # seaborn作為matplotlib的補充,匯入後會覆蓋matplotlib的預設作圖風格

sns.pairplot(dataset, hue='class', vars=["feature1", "feature2", "feature3", "feature4"]) # hue : 使用指定變數為分類變數畫圖;vars : 與data使用,否則使用data的全部變數

plt.show() # 仍然使用matplotlib的顯示函式

繪製影象如下:

在訓練神經網路時,訓練集的資料要分開使用:輸入每個資料的n維特徵,得到神經網路的輸出結果,並將該結果與訓練集中的類別[標籤]來對比,構造誤差函式等,從而利用梯度下降演算法對神經網路的模型進行優化。

可以使用pandas包中的iloc和loc屬性,其中

loc是根據dataframe的行、列標籤名來進行選取,可以選取單個元素,也可以選取乙個區域

iloc是根據dataframe的行、列索引來進行選取,可以選取單個元素,也可以選取乙個區域

**如下:

data = dataset.iloc[0: 150, 0: 4]  # 輸入

# print(data)

label = dataset.iloc[0: 150, 4] # 標籤

# print(label)

有時輸入資料的幾個特徵(維度)所在的數值範圍是不一致的,這意味著資料存在偏差,不利於神經網路的處理,需要將所有特徵的值規劃到同一數值範圍內。

處理方法:一般將大的特徵值縮小,可使用(x-min)/(max-min)規劃到[0,1]的範圍內。

本例**:

data['feature2'] = (data['feature2'] - data['feature2'].min()) / (data['feature2'].max() - data['feature2'].min())

data['feature4'] = (data['feature4'] - data['feature4'].min()) / (data['feature4'].max() - data['feature4'].min())

原始訓練集的類別為0,1,2,不容易進行神經網路的訓練,需要對標籤進行one-hot編碼;即有n種類別便將每個影象的標籤轉化為n維向量,只有其對應正確類別的索引下的值為1,其餘為0。

本專案是乙個三分類問題,類別(離散特徵)的取值之間沒有大小關係,可以使用one-hot編碼。[若有大小關係則採用數值對映的方式]

將標籤進行one-hot編碼後,可以對應softmax函式概率分布意義,得到神經網路的**結果並進行誤差分析。

使用pandas庫中的get_dummies方法進行one-hot編碼:

one_hot_label = pd.get_dummies(label)
得到編碼後的部分標籤如下:

有很多方式可以進行資料集的隨機劃分:

使用numpy.random.choice

使用sklearn.model_selection.train_test_splitsklearn.cross_validation.train_test_split,其中cross_validation指交叉驗證

這裡使用第2種方式:

from sklearn.cross_validation import train_test_split

# 使用sklearn.cross_validation.train_test_split方法,暫取隨機數種子為1,以在重複試驗時,得到相同的隨機數組

train_data, test_data, train_label, test_label = train_test_split(data, label, test_size=0.3, random_state=1)

神經網路在分類中的應用

我們知道,邏輯回歸可以用來分類,但僅僅是對於特徵量很少時,當特徵量特別多時,就不適用了,所以引入了神經網路。宣告一下,當類別數c 3時,輸出層有c個結點,否則只用乙個結點就可以了 啟用函式就是非線性函式比如sigmoid relu等。1.神經網路 神經網路的代價函式 具體推導公式參考 2.梯度檢測 ...

神經網路多分類任務的損失函式 交叉熵

神經網路解決多分類問題最常用的方法是設定n個輸出節點,其中n為類別的個數。對於每乙個樣例,神經網路可以得到的乙個n維陣列作為輸出結果。陣列中的每乙個維度 也就是每乙個輸出節點 對應乙個類別。在理想情況下,如果乙個樣本屬於類別k,那麼這個類別所對應的輸出節點的輸出值應該為1,而其他節點的輸出都為0。以...

神經網路多分類任務的損失函式 交叉熵

神經網路解決多分類問題最常用的方法是設定n個輸出節點,其中n為類別的個數。對於每乙個樣例,神經網路可以得到的乙個n維陣列作為輸出結果。陣列中的每乙個維度 也就是每乙個輸出節點 對應乙個類別。在理想情況下,如果乙個樣本屬於類別k,那麼這個類別所對應的輸出節點的輸出值應該為1,而其他節點的輸出都為0。以...