標籤: 神經網路 多分類
目錄訓練資料集和測試資料集的劃分主要工具:pandas
matplotlib
seaborn
numpy
sklearn
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_split
或sklearn.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。以...