python 2.7 - how - Error de RandomForestClassifier: el número de características debe coincidir con la entrada
random forest python example (1)
La forma de su archivo csv es (n_examples, 3)
. Usted divide esta matriz en dos listas que contienen las variables de respuesta y las variables de entrada cuando llama:
target = [x[0] for x in dataset]
train = [x[1:] for x in dataset]
Por lo tanto, el target
es la forma (n_examples, 1)
y train
es la forma (n_examples, 2)
. A continuación, lea en el mismo archivo csv para probar (no sé por qué está usando datos de entrenamiento para probar o por qué necesita leer el archivo de nuevo en este punto). De todos modos, esto significa que la test
es la forma (n_examples, 3)
.
predecir toma entradas y produce respuestas usando los parámetros del modelo aprendidos a través del fit
llamada. Así que predict
espera recibir una lista de variables de entrada de forma (2,)
o una matriz de forma (n_examples, 2)
. Debería ver dónde está sucediendo la falta de coincidencia ahora.
Para solucionarlo, llame a rf.predict(test[1:, 1:])
. Este corte toma todo desde la fila 1 en adelante y todo desde la columna 1 en adelante, omitiendo la primera fila suponiendo que contiene información del encabezado (debe verificar que el encabezado efectivamente se lee) y omitiendo la primera columna de cada fila para omitir las variables de respuesta para cada ejemplo.
Por supuesto, dado que la prueba se leyó desde el mismo archivo que sus datos de entrenamiento, esto es equivalente a rf.predict(train)
.
Soy relativamente nuevo en sklearn y he intentado utilizar el siguiente código:
from sklearn.ensemble import RandomForestClassifier
from numpy import genfromtxt, savetxt
def main():
#create the training & test sets, skipping the header row with [1:]
dataset = genfromtxt(open(''mypath/data1.csv'',''r''), delimiter='','', dtype=''f8'')[1:]
target = [x[0] for x in dataset]
train = [x[1:] for x in dataset]
test = genfromtxt(open(''mypath/data1.csv'',''r''), delimiter='','', dtype=''f8'')[1:]
#create and train the random forest
#multi-core CPUs can use: rf = RandomForestClassifier(n_estimators=100, n_jobs=2)
rf = RandomForestClassifier(n_estimators=100)
rf.fit(train, target)
savetxt(myoutput/data1_output.csv'', rf.predict(test), delimiter='','', fmt=''%f'')
if __name__=="__main__":
main()
Este código ejecuta un clasificador de bosque aleatorio en un archivo .csv que contiene tres columnas, la primera de las cuales contiene etiquetas, mientras que las otras dos contienen características. Cuando ejecuto este programa, aparece el siguiente error:
ValueError: Number of features of the model must match the input. Model n_features is 2 and input n_features is 3
Mi suposición inicial fue que había un componente llamado n_features que necesitaría ajustar a mi caso de uso. Sin embargo, parece ser más complejo que esto. ¿Alguien podría explicar si y cómo podría obtener un .csv del tipo que describí anteriormente para ejecutar con éxito este código?
Vi esta publicación , que sugiere que el problema es que el código incluye mis etiquetas como una característica. Sin embargo, realmente no entiendo cómo la solución presentada a ese problema resuelve este problema, por lo que agradecería enormemente una explicación adicional.