En el aprendizaje automático, cuando queremos entrenar nuestro modelo ML, dividimos todo nuestro conjunto de datos en training_set y test_set usando la clase train_test_split() presente en sklearn. Luego entrenamos nuestro modelo en training_set y probamos nuestro modelo en test_set. Los problemas a los que nos vamos a enfrentar en este método son:
Cada vez que cambiamos el parámetro random_state presente en train_test_split(), obtenemos una precisión diferente para diferentes estados aleatorios y, por lo tanto, no podemos señalar exactamente la precisión de nuestro modelo.
train_test_split() divide el conjunto de datos en training_test y test_set mediante un muestreo aleatorio. Pero se realiza un muestreo estratificado.
¿Qué son el muestreo aleatorio y el muestreo estratificado?
Suponga que desea realizar una encuesta y decide llamar a 1000 personas de un estado en particular, si elige 1000 hombres por completo o 1000 mujeres por completo o 900 mujeres y 100 hombres (al azar) para pedir su opinión sobre un producto en particular. Luego, en base a estas 1000 opiniones, no puede decidir la opinión de todo el estado sobre su producto. Este es un muestreo aleatorio.
Pero en el muestreo estratificado, deje que la población de ese estado sea 51,3 % de hombres y 48,7 % de mujeres. Luego, para elegir 1000 personas de ese estado, si elige 513 hombres (51,3 % de 1000) y 487 mujeres (48,7 % de 1000), es decir, 513 hombres + 487 mujeres (Total=1000 personas) para pedir su opinión. Entonces estos grupos de personas representan a todo el estado. Esto se llama muestreo estratificado.
¿Por qué no se prefiere el muestreo aleatorio en el aprendizaje automático?
Consideremos un problema de clasificación de clases binarias. Deje que nuestro conjunto de datos consista en 100 muestras, de las cuales 80 son de clase negativa { 0 } y 20 son de clase positiva { 1 }.
Muestreo aleatorio:
si hacemos un muestreo aleatorio para dividir el conjunto de datos en conjunto_de_entrenamiento y conjunto_de_prueba en una proporción de 8:2 respectivamente. Entonces podríamos obtener todas las clases negativas {0} en conjunto_de_entrenamiento, es decir, 80 muestras en prueba_de_entrenamiento y las 20 clases positivas {1} en test_set. Ahora, si entrenamos nuestro modelo en training_set y probamos nuestro modelo en test_set, obviamente obtendremos una mala puntuación de precisión.
Muestreo estratificado:
en el muestreo estratificado, el conjunto_de_entrenamiento consta de 64 clases negativas{0} (80% 0f 80) y 16 clases positivas {1} (80% de 20), es decir, 64{0}+16{1}=80 muestras en training_set que representa el conjunto de datos original en igual proporción y, de manera similar, test_set consta de 16 clases negativas {0} (20 % de 80) y 4 clases positivas{1} (20 % de 20), es decir, 16{0}+4{1}= 20 muestras en test_set que también representa todo el conjunto de datos en igual proporción. Este tipo de tren-prueba-división da como resultado una buena precisión.
¿Cuál es la solución a los problemas mencionados?
La solución para el primer problema en el que pudimos obtener diferentes puntajes de precisión para diferentes valores de parámetros de estado aleatorio es usar la validación cruzada K-Fold. Pero K-Fold Cross Validation también sufre el segundo problema, es decir, el muestreo aleatorio.
La solución tanto para el primer como para el segundo problema es utilizar la validación cruzada estratificada de K-Fold.
¿Qué es la validación cruzada estratificada de K-Fold?
La validación cruzada de k-fold estratificada es lo mismo que la validación cruzada de k-fold, pero la validación cruzada de k-fold estratificada, hace un muestreo estratificado en lugar de un muestreo aleatorio.
Código: implementación de código Python de validación cruzada estratificada K-Fold
Python3
# This code may not be run on GFG IDE # as required packages are not found. # STRATIFIES K-FOLD CROSS VALIDATION { 10-fold } # Import Required Modules. from statistics import mean, stdev from sklearn import preprocessing from sklearn.model_selection import StratifiedKFold from sklearn import linear_model from sklearn import datasets # FEATCHING FEATURES AND TARGET VARIABLES IN ARRAY FORMAT. cancer = datasets.load_breast_cancer() # Input_x_Features. x = cancer.data # Input_ y_Target_Variable. y = cancer.target # Feature Scaling for input features. scaler = preprocessing.MinMaxScaler() x_scaled = scaler.fit_transform(x) # Create classifier object. lr = linear_model.LogisticRegression() # Create StratifiedKFold object. skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=1) lst_accu_stratified = [] for train_index, test_index in skf.split(x, y): x_train_fold, x_test_fold = x_scaled[train_index], x_scaled[test_index] y_train_fold, y_test_fold = y[train_index], y[test_index] lr.fit(x_train_fold, y_train_fold) lst_accu_stratified.append(lr.score(x_test_fold, y_test_fold)) # Print the output. print('List of possible accuracy:', lst_accu_stratified) print('\nMaximum Accuracy That can be obtained from this model is:', max(lst_accu_stratified)*100, '%') print('\nMinimum Accuracy:', min(lst_accu_stratified)*100, '%') print('\nOverall Accuracy:', mean(lst_accu_stratified)*100, '%') print('\nStandard Deviation is:', stdev(lst_accu_stratified))
Producción:
List of possible accuracy: [0.9298245614035088, 0.9649122807017544, 0.9824561403508771, 1.0, 0.9649122807017544, 0.9649122807017544, 0.9824561403508771, 0.9473684210526315, 0.9473684210526315, 0.9821428571428571] Maximum Accuracy That can be obtained from this model is: 100.0 % Minimum Accuracy That can be obtained from this model is: 92.98245614035088 % The overall Accuracy of this model is: 96.66353383458647 % The Standard Deviation is: 0.02097789213195869