k vecinos más cercanos con validación cruzada para puntuación de precisión y matriz de confusión

Tengo los siguientes datos donde para cada columna, las filas con números son la entrada y la letra es la salida.

A,A,A,B,B,B -0.979090189,0.338819904,-0.253746508,0.213454999,-0.580601104,-0.441683968 -0.48395313,0.436456904,-1.427424032,-0.107093825,0.320813402,0.060866105 -1.098818173,-0.999161692,-1.371721698,-1.057324962,-1.161752652,-0.854872591 -1.53191442,-1.465454248,-1.350414216,-1.732518018,-1.674040715,-1.561568496 2.522796162,2.498153298,3.11756171,2.125738509,3.003929536,2.514411247 -0.060161596,-0.487513844,-1.083513761,-0.908023322,-1.047536921,-0.48276759 0.241962669,0.181365373,0.174042637,-0.048013217,-0.177434916,0.42738621 -0.603856395,-1.020531402,-1.091134021,-0.863008165,-0.683233589,-0.849059931 -0.626159165,-0.348144322,-0.518640038,-0.394482485,-0.249935646,-0.543947259 -1.407263942,-1.387660115,-1.612988118,-1.141282747,-0.944745366,-1.030944216 -0.682567673,-0.043613473,-0.105679403,0.135431139,0.059104888,-0.132060832 -1.10107164,-1.030047313,-1.239075022,-0.651818656,-1.043589073,-0.765992541 

Estoy tratando de realizar KNN LOOCV para obtener el puntaje de precisión y la matriz de confusión.

 from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix from sklearn.model_selection import LeaveOneOut import pandas as pd def main(): csv = 'data.csv' df = pd.read_csv(csv) X = df.values.T y = df.columns.values clf = KNeighborsClassifier() loo = LeaveOneOut() for train_index, test_index in loo.split(X): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] clf.fit(X_train, y_train) y_true = y_test y_pred = clf.predict(X_test) ac = accuracy_score(y_true, y_pred) cm = confusion_matrix(y_true, y_pred) print ac print cm if __name__ == '__main__': main() 

Sin embargo mis resultados son todos 0s. ¿A dónde me voy mal?

Creo que su modelo no se entrena adecuadamente y porque solo tiene que adivinar un valor, no lo hace bien. Puedo sugerir cambiar a KFold o StratifiedKFold. LOO tiene la desventaja de que, para muestras grandes, se vuelve extremadamente lento. Esto es lo que sucedió cuando implementé StratifiedKFold con 3 divisiones en sus datos X. He rellenado aleatoriamente y con 0 y 1, en lugar de utilizar A y B y no he transpuesto los datos, por lo que tiene 12 filas:

 from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix from sklearn.model_selection import StratifiedKFold import pandas as pd csv = 'C:\df_low_X.csv' df = pd.read_csv(csv, header=None) print(df) X = df.iloc[:, :-1].values y = df.iloc[:, -1].values clf = KNeighborsClassifier() kf = StratifiedKFold(n_splits = 3) ac = [] cm = [] for train_index, test_index in kf.split(X,y): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] print(X_train, X_test) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) ac.append(accuracy_score(y_test, y_pred)) cm.append(confusion_matrix(y_test, y_pred)) print(ac) print(cm) # ac [0.25, 0.75, 0.5] # cm [array([[1, 1], [2, 0]], dtype=int64), array([[1, 1], [0, 2]], dtype=int64), array([[0, 2], [0, 2]], dtype=int64)]