regresion - modelos machine learning python
Problemas para entender la salida del bosque aleatorio scikit (2)
Digamos que tengo un conjunto de datos como este:
5.9;0.645;0.12;2;0.075;32;44;0.99547;3.57;0.71;10.2;5
6;0.31;0.47;3.6;0.067;18;42;0.99549;3.39;0.66;11;6
donde las primeras 11 columnas indican características (acidez, cloruros, etc.) y la última columna indica la calificación otorgada al elemento (por ejemplo, 5 o 6)
El conjunto de datos se entrena así:
target = [x[11] for x in dataset]
train = [x[0:11] for x in dataset]
rf = RandomForestClassifier(n_estimators=120, n_jobs=-1)
rf.fit(train, target)
predictions = rf.predict_proba(testdataset)
print predictions[0]
que imprime algo así como
[ 0. 0.01666667 0.98333333 0. 0. 0. ]
Ahora, ¿por qué no genera una sola clasificación, por ejemplo, una calificación de 5 o 6?
La documentación dice: "Las probabilidades de clase pronosticadas de una muestra de entrada se calculan como las probabilidades promedio pronosticadas de clase de los árboles en el bosque", lo cual estoy teniendo problemas para comprender.
Si utiliza
print rf.predict(testdataset[-1])
[ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.]
Imprime algo más de lo que cabría esperar, al menos se parece a las clasificaciones, pero todavía no entiendo por qué hay una predicción por función y no una sola predicción que tenga en cuenta todas las características.
Además de la respuesta de Diego:
RandomForestClassifier
es un clasificador para predecir la asignación de clase para un número discreto de clases sin ordenar entre las etiquetas de clase.
Si desea obtener una calificación de coma flotante continua, debe intentar usar un modelo de regresión como RandomForestRegressor
en RandomForestRegressor
lugar.
Puede que tenga que fijar la salida al rango [0, 6] ya que no hay garantía de que el modelo no generará predicciones como, por ejemplo, 6.2
.
Editar para responder el segundo punto, el método de predict
espera una lista de muestras. Por lo tanto, debe proporcionarle una lista de una muestra en su caso. Tratar:
print rf.predict([testdataset[-1]])
o alternativamente:
print rf.predict(testdataset[-1:])
Me pregunto por qué no obtienes un error en ese caso.
Editar : la salida realmente no tiene sentido: ¿cuál es la forma de tus conjuntos de datos?
>>> print np.asarray(train).shape
>>> print np.asarray(target).shape
>>> print np.asarray(testdataset).shape
De los documentos, predict_proba
regresa:
p: array of shape = [n_samples, n_classes], o una lista de n_outputs tales arrays si n_outputs> 1. Las probabilidades de clase de las muestras de entrada. Las clases se ordenan por orden aritmético.
La clave aquí es la última frase " Las clases están ordenadas por orden aritmético ". Supongo que algunas de tus muestras de entrenamiento tienen una clase menor que 5, que predict_proba
asignó una probabilidad de cero, mientras que las clases 5 y 6 tienen probabilidades 0.01666667 y 0.98333333, respectivamente, mientras que otras 3 clases, todas> 6, también tienen probabilidad cero .