Предсказать множественные значения как результат модели в обучении scikit - PullRequest
1 голос
/ 18 июня 2019

Я создал модель, используя алгоритм обучения Scikit.

rf = RandomForestClassifier(n_estimators = 10,random_state=seed)
rf.fit(X_train,Y_train)

shift_id=2099.0
user_id=1402.0
status=['S']
shift_organisation_id=15.0
shift_department_id=20.0
open_positions=71.0
city=['taunton']
role_id=3.0
specialty_id=16.0
years_of_experience=10.0
nurse_zip=2780.0
shifts_zip=2021.0

status = status_encoder.transform(status)
city = city_encoder.transform(city)

X = np.array([shift_id, user_id, status, shift_organisation_id, shift_department_id, open_positions, city, role_id, specialty_id, years_of_experience, nurse_zip, shifts_zip])
location_id = rf.predict(X.reshape(1,-1))
print(location_id)

, который дает такой результат

[25]

Насколько я понимаю, 25 является лучшим значением прогнозирования для этой модели,Но я хочу получить лучшие 3 значения в результате.Как я могу получить это?

В этом случае результат предсказания будет выглядеть как

[23,45,25]

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Для этого у вас есть метод predict_proba, который возвращает прогноз вероятностей класса.

Давайте проверим пример с использованием набора данных iris :

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target
# train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y)

rf = RandomForestClassifier(n_estimators = 10, random_state=10)
rf.fit(x_train,y_train)

Если вы теперь вызываете метод predict, как и ожидалось, вы получаете класс наибольшей вероятности:

rf.predict(X_test)
# array([1, 2, 1, 0, 2, 0, 2, 0, 0, 1, 2, ...

Однако, вызывая predict_proba вы получите соответствующие вероятности:

rf.predict_proba(X_test)

array([[0.        , 1.        , 0.        ],
       [0.11      , 0.1       , 0.79      ],
       [0.        , 0.7       , 0.3       ],
       [0.5       , 0.4       , 0.1       ],
       [0.        , 0.3       , 0.7       ],
       [0.5       , 0.2       , 0.3       ],
       [0.4       , 0.        , 0.6       ],
       ...

Чтобы получить самые высокие k вероятности, вы можете использовать argsort и индексировать соответствующие вероятности rf.classes_:

k = 2
rf.classes_[rf.predict_proba(X_test).argsort()[:,-k:]]

array([[2, 1],
       [0, 2],
       [2, 1],
       [1, 0],
       [1, 2],
       [2, 0],
       [0, 2],
       [1, 0],
       [1, 0],
       [2, 1],
       ...

Выше можно улучшить, используя argpartition, так как нас интересуют только верхние k вероятности:

rf.classes_[rf.predict_proba(X_test).argpartition(range(k))[:,-k:]]
1 голос
/ 18 июня 2019

Вы можете predict_proba метод, чтобы вернуть вероятности класса и получить из него 3 верхних значения ref

rf = RandomForestClassifier(n_estimators = 10,random_state=seed)
rf.fit(X_train,Y_train)

shift_id=2099.0
user_id=1402.0
status=['S']
shift_organisation_id=15.0
shift_department_id=20.0
open_positions=71.0
city=['taunton']
role_id=3.0
specialty_id=16.0
years_of_experience=10.0
nurse_zip=2780.0
shifts_zip=2021.0

status = status_encoder.transform(status)
city = city_encoder.transform(city)

X = np.array([shift_id, user_id, status, shift_organisation_id, shift_department_id, open_positions, city, role_id, specialty_id, years_of_experience, nurse_zip, shifts_zip])
location_id = rf.predict_proba(X.reshape(1,-1))
print(location_id)
...