1
votes

Différents résultats lors de l'utilisation de train_test_split par rapport au fractionnement manuel des données

J'ai un dataframe pandas sur lequel je veux faire des prédictions et obtenir l'erreur quadratique moyenne racine pour chaque fonctionnalité. Je suis un guide en ligne qui divise le jeu de données manuellement, mais j'ai pensé qu'il serait plus pratique d'utiliser train_test_split depuis sklearn.model_selection . Malheureusement, j'obtiens des résultats différents lorsque je regarde les valeurs rmse après avoir divisé les données manuellement par rapport à l'utilisation de train_test_split .

Un exemple (espérons-le) reproductible:

def knn_train_test2(train_col, target_col, df2):

    knn = KNeighborsRegressor()
    np.random.seed(0)

    X_train, X_test, y_train, y_test = train_test_split(df2[[train_col]],df2[[target_col]], test_size=0.5)

    knn.fit(X_train,y_train)

    predictions = knn.predict(X_test)

    mse = mean_squared_error(y_test,predictions)

    rmse = np.sqrt(mse)

    return rmse

rmse_results = {}
train_cols = df2.columns.drop('target')

for col in train_cols:
    rmse_val = knn_train_test2(col, 'target', df2)
    rmse_results[col] = rmse_val


rmse_results_series = pd.Series(rmse_results)
rmse_results_series.sort_values()

# Output
feature_4    0.522303
feature_3    0.556417
feature_1    0.569210
feature_2    0.572713
dtype: float64


3 commentaires

N'est-ce pas prévu? Je ne suis pas un expert en ML, mais si vous divisez au hasard les données dans les deux cas, le modèle formé à partir d'eux devrait être différent, ce qui conduirait alors à un rmse différent?


oui, c'est prévu.


Bien sûr. Merci pour la réponse. Réponse assez évidente!


3 Réponses :


1
votes

Le fractionnement manuel des données n'est qu'un découpage, mais train_test_split va également randomiser les données découpées. Essayez de corriger la graine de nombre aléatoire et voyez si vous pouvez obtenir les mêmes résultats à chaque fois en utilisant train_test_split .


1 commentaires

Non, je veux dire que vous devriez voir le même résultat lors de l'exécution avec train_test_split si vous avez corrigé la graine, sinon il devrait y avoir des résultats différents même si train_test_split est utilisé, ce qui a plutôt prouvé l'opération d'échantillonnage aléatoire que le simple tranchage.



2
votes

Il s'agit de la nature de base de l'apprentissage automatique. Lorsque vous divisez manuellement les données, vous disposez d'une version différente de l'ensemble d'entraînement et de test. Lorsque vous utilisez la fonction sklearn, vous obtenez différents ensembles d'entraînement et de test. Votre modèle fera des prédictions en fonction des données d'entraînement qu'il reçoit et donc vos résultats finaux sont différents pour les deux.

Si vous souhaitez reproduire le résultat, utilisez le train_test_split pour créer plusieurs ensembles d'apprentissage en définissant une valeur de départ. Une valeur de départ est utilisée pour reproduire le même résultat dans la fonction train_test_split. Ensuite, lorsque vous exécutez votre fonction ml, définissez-y également une graine, car même les fonctions ML commencent à s'entraîner avec des poids aléatoires. Essayez votre modèle sur ces ensembles de données avec la même graine et vous obtiendrez les résultats.


0 commentaires

2
votes

Votre implémentation personnalisée de train_test_split diffère de l'implémentation de scikit-learn, c'est pourquoi vous obtenez des résultats différents pour la même graine.

Ici , vous pouvez trouver la mise en œuvre officielle. La première chose qui est notable est que scikit-learn effectue par défaut 10 itérations de re-shuffeling et de fractionnement. (vérifiez le paramètre n_splits )

Seulement si votre approche fait exactement la même chose que l'approche scitkit-learn, vous pouvez vous attendre à obtenir le même résultat pour la même graine.


0 commentaires