【问题标题】:Python: how to train the same model different times?Python:如何在不同时间训练同一个模型?
【发布时间】:2019-03-29 21:21:20
【问题描述】:

我有一个小数据集,我想尝试使用来自sklearnMulti-layer Perceptron regressor 预测相同变量的值。

这就是我正在做的:

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor


X_train, X_test, y_train, y_test = train_test_split(X, Y)
scaler  = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test  = scaler.transform(X_test)

mlp    = MLPRegressor(hidden_layer_sizes=(10,10))
mlp    = mlp.fit(X_train,y_train)
test_y = mlp.predict(X_test)

现在训练集由100 示例组成。我想做的是在7525中将训练集拆分四次,以便用4不同的数据集训练相同的模型。

这就是我正在做的事情:

c1 = 0
c2 = 25
for i in range(0,4):
    xt = X_train[c1:c2]
    yt = np.setdiff1d(X_train, xt)
    c1 = c2 + 1
    c2 = c2 + 25
    mlp = mlp.fit(xt ,yt)

【问题讨论】:

  • 你说的是交叉验证吗?那么sklearn中的一些相关功能见this描述。
  • 是的,请查看修改后的代码。
  • 有什么问题?
  • @UmangGupta 问题:我是不是训练了四次同一个模型?

标签: python machine-learning scikit-learn neural-network


【解决方案1】:

您应该得到一个错误,因为您在上一次迭代中访问了X_train 超出了它的范围。这是当然的,因为X_train 只有 100 个样本。

访问以下形式myArray[a:b] 的数组意味着我要检索从a 开始直到但不包括b 的元素。

因此,您需要更改此行:

c1 = c2 + 1

到这个:

c1 = c2

查看documentation 以了解如何访问 numpy 数组。

【讨论】:

    【解决方案2】:
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.neural_network import MLPRegressor
    import numpy as np
    from sklearn.model_selection import cross_validate
    
    # Generate some random data
    X = np.random.rand(100,5)
    Y = np.dot(X, np.random.rand(5))+np.random.rand(100)
    
    # Split into train and test
    X_train, X_test, y_train, y_test = train_test_split(X, Y)
    
    # Use 4 fold cross validation on train data
    cv_results = cross_validate(MLPRegressor(hidden_layer_sizes=(10,10)), X_train, y_train, cv=4, 
                                scoring=('neg_mean_squared_error'), return_estimator=True)
    print (cv_results['test_score'])
    
    # Make predictions on test data
    y = np.zeros(len(y_test))
    for i, model in enumerate(cv_results['estimator']):
        y_hat = model.predict(X_test)
        print ("Model {0} MSE Error: {1}".format(i, 
            mean_squared_error(y_test, y_hat)))
        y += y_hat
    
    print ("Average Test MSE Error: {0}".format(
            mean_squared_error(y_test, y/len(models))))
    

    代码在 cmets 中进行了解释。我们将数据分为训练数据和隐藏测试数据。我们在训练数据上做 CV 4 倍。如下图所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2018-12-02
      • 2020-06-27
      • 2021-02-20
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多