Почему образец набора данных изменяет скорость прогнозирования модели?

#python #machine-learning #scikit-learn #object-detection #random-forest

Вопрос:

Я играл с классификатором sklearn randomForest и кое — чего не понимаю.

Я создал модель, которая классифицирует каждый пиксель в зависимости от того, соответствует ли он объекту или нет, в данном случае груше. Что-то вроде этого:

введите описание изображения здесь

Чтобы обучить эту модель, я использовал эти три изображения:

введите описание изображения здесь

Теперь дело в том, что я создал две разные модели, каждая из которых использует другую маску с надписью для одних и тех же обучающих изображений:

модель 1:

введите описание изображения здесь

модель 2:

введите описание изображения здесь

Обе модели имеют приемлемую точность, но проблема здесь в том, что первой модели требуется около 0,5 секунды, чтобы сделать прогноз для 10 новых изображений, в то время как модели 2 требуется около 4 секунд, чтобы сделать прогноз для тех же 10 изображений. Как это возможно?

ОТРЕДАКТИРУЙТЕ с помощью кода и дополнительной информации, как предложил @TYZ

 def train_model(image_path, labeled_image_path, test_split=0.3):  train_img = cv2.imread(image_path) #Load training image  train_img = cv2.cvtColor(train_img, cv2.COLOR_BGR2RGB) #Convert BGR to RGB  train_img = train_img[:, :, 2] #Only take the GREEN channel (Try for each channel and select the best)   df = generate_features(train_img) #Create a dataFrame containing all features   train_img_labeled = cv2.imread(labeled_image_path)  train_img_labeled = cv2.cvtColor(train_img_labeled, cv2.COLOR_BGR2GRAY) #Load labeled image  df["Labels"] = train_img_labeled.reshape(-1)   Y = df["Labels"].values  X = df.drop(labels=["Labels"], axis=1)   # Split the data into train and test  from sklearn.model_selection import train_test_split  X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_split, random_state=20)   #Create new model  from sklearn.ensemble import RandomForestClassifier  model = RandomForestClassifier(n_estimators = 5, random_state = 25, max_depth=1, n_jobs=1)   # Train the model  model.fit(X_train, y_train)  return model   
 def test(model):    image_paths = ["test/scaled/test_1.jpeg", "test/scaled/test_2.jpeg", "test/scaled/test_3.jpeg", "test/scaled/test_4.jpeg", "test/scaled/test_5.jpeg", "test/scaled/test_6.jpeg", "test/scaled/test_7.jpeg",  "test/scaled/test_8.jpeg", "test/scaled/test_9.jpeg", "test/scaled/test_10.jpeg"]    import time  start_time = time.time()    for image_path in image_paths:  start_time = time.time()  result = calculate_model_output(model, image_path, show=False)    print("--- %s seconds ---" % (time.time()-start_time))  

введите описание изображения здесь

Комментарии:

1. Вам придется предоставить нам дополнительную информацию, чтобы мы могли вам помочь. Пожалуйста, предоставьте минимальный воспроизводимый пример с вашим кодом, данными или даже моделями, которые вы обучили, чтобы мы могли воспроизвести разницу во времени прогнозирования.

2. Проверьте среднюю глубину деревьев в двух моделях; возможно, ваша вторая модель закончила тем, что в среднем деревья росли глубже. (И, возможно, лучше всего измерить глубину ваших тестовых образцов; вероятно, самый простой способ сделать это-получить доступ к базовым DecisionTreeClassifier объектам и использовать их decision_path метод.)

3. @TYZ Оригинальное сообщение отредактировано с дополнительной информацией.

4. @BenReiniger Теперь я обновил сообщение кодом и дополнительной информацией, как вы можете видеть, я создал модель с max_depth = 1 в обоих случаях.

5. Имея всего 5 деревьев глубиной 1, я был бы удивлен, если бы предсказание заняло сколько-нибудь значительное время; загрузка изображений вполне может занять больше времени. Согласуются ли эти сроки? Какая разница, если вы измените порядок проведения тестов?