Bobo老師機器學習筆記第八課-如何防止過擬合和欠擬合?
問題一、什麼是過擬合和欠擬合?
首先擬合是一個統計學概念,它表示所求函式逼近目標函式的遠近程度。應用的機器學習中,就是我們所求的函式與未知的對映函式之間的相似度。如何求得函式引數與潛在的函式引數越逼近,說明效果越好。
假設我們用上篇部落格中的資料,原始碼可以見上文:
通過上圖可以看出:
欠擬合是我們求得的模型測試集和訓練集都不好
過擬合是我們求得模型在訓練集表現好,在測試集表現不好
舉一個簡單的例子: 上圖中我們的資料是一個X的2次函式生產的點。 欠擬合求得模型是1次直線,而過擬合是求得X的10次方。
二、如何判斷防止過擬合和欠擬合?
步驟一:我們要對原資料進行分割,分為訓練集和測試集
在sklearn中可以用train_test_split方法進行切分。
from sklearn.model_selection import train_test_split
步驟二:求出模型我們用均方差MSE的方法來評估演算法,不瞭解MSE可以看這篇博文
在sklearn中可以直接匯入
from sklearn.metrics import mean_squared_error
這個值越小就說明越好,如下圖,通過MSE可以看出,在degree=2為2的時候mse最小。
三、除了MSE,還有其他視覺化過擬合和欠擬合的方法嗎?
當然有,那就是學習曲線。那什麼是學習曲線呢?學習曲線就是指訓練模型在不同的訓練集和測試集表現的曲線。
這段程式碼時Bobo老師在講學習曲線時候的程式碼。
def plot_learning_curve(algo, X_train, X_test, y_train, y_test): train_score = [] test_score = [] for i in range(1, len(X_train)+1): algo.fit(X_train[:i], y_train[:i]) y_train_predict = algo.predict(X_train[:i]) train_score.append(mean_squared_error(y_train[:i], y_train_predict)) y_test_predict = algo.predict(X_test) test_score.append(mean_squared_error(y_test, y_test_predict)) plt.plot([i for i in range(1, len(X_train)+1)], np.sqrt(train_score), label="train") plt.plot([i for i in range(1, len(X_train)+1)], np.sqrt(test_score), label="test") plt.legend() plt.axis([0, len(X_train)+1, 0, 4]) plt.show() plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)
在這段程式碼中我們要注意:
1、第一引數algo是指訓練模型
2、每次給模型訓練的資料是遞增的,從1到訓練樣本總長度
3、模型的評分指標還是用mean_squared_error這個方法。
從上面三幅圖看出:
欠擬合和最佳相比,Y軸的平衡數值大(最佳大約1左右,而欠擬合是1.8左右);達到平衡點是兩者距離間距交大;達到平衡點所需要樣本數更多
過擬合和最佳相比,資料波動太大,無法找到資料集的平衡點
由於篇幅關係,下一篇我們一起學習一下交叉驗證,看看對過擬合有什麼幫助
其他資料:
要是你在西安,感興趣一起學習AIOPS,歡迎加入QQ群 860794445