1. 程式人生 > >Bobo老師機器學習筆記第八課-如何防止過擬合和欠擬合?

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