''' 分類模型數據集划分問題: 對於分類問題訓練集和測試集的划分不應該用整個樣本空間的特定百分比作為訓練數據, 而應該在其每一個類別的樣本中抽取特定百分比作為訓練數據。sklearn模塊提供了數據集划分相關方法, 可以方便的划分訓練集與測試集數據,使用不同數據集訓練或測試模型,達到提高分類可信度。 回歸模型數據集直接打亂按照二八原則划分即可 數據集划分相關API: import sklearn.model_selection as ms ms.train_test_split(輸入集, 輸出集, test_size=測試集占比, random_state=隨機種子) ->訓練輸入, 測試輸入, 訓練輸出, 測試輸出 案例: ''' import numpy as np import matplotlib.pyplot as mp import sklearn.naive_bayes as nb import sklearn.model_selection as ms data = np.loadtxt('./ml_data/multiple1.txt', delimiter=',', unpack=False, dtype='f8') print(data.shape) x = np.array(data[:, :-1]) y = np.array(data[:, -1]) # 訓練集和測試集的划分 使用訓練集訓練 再使用測試集測試,並繪制測試集樣本圖像 train_x, test_x, train_y, test_y = ms.train_test_split(x, y, test_size=0.25, random_state=7) # 訓練NB模型,完成分類業務 model = nb.GaussianNB() model.fit(train_x, train_y) pred_test_y = model.predict(test_x) # 得到預測輸出,可以與真實輸出作比較,計算預測的精准度(預測正確的樣本數/總測試樣本數) ac = (test_y == pred_test_y).sum() / test_y.size print('預測精准度 ac=', ac) # 繪制分類邊界線 l, r = x[:, 0].min() - 1, x[:, 0].max() + 1 b, t = x[:, 1].min() - 1, x[:, 1].max() + 1 n = 500 grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n)) bg_x = np.column_stack((grid_x.ravel(), grid_y.ravel())) bg_y = model.predict(bg_x) grid_z = bg_y.reshape(grid_x.shape) # 畫圖 mp.figure('NB Classification', facecolor='lightgray') mp.title('NB Classification', fontsize=16) mp.xlabel('X', fontsize=14) mp.ylabel('Y', fontsize=14) mp.tick_params(labelsize=10) mp.pcolormesh(grid_x, grid_y, grid_z, cmap='gray') mp.scatter(test_x[:, 0], test_x[:, 1], s=80, c=test_y, cmap='jet', label='Samples') mp.legend() mp.show() 輸出結果: (400, 3) 預測精准度 ac= 0.99

