Я написал программу на python, чтобы использовать алгоритм машинного обучения для прогнозирования данных. Я использую функцию RandomForestClassifier от Scikit Learn, чтобы создать случайный лес, чтобы делать прогнозы.смещение randomforestclassifier scikit learn
Цель программы - предсказать, является ли неизвестный астрофизический источник пульсаром или агн; поэтому он обучает лес по известным данным, из которых он знает, являются ли источники пульсаром или агн, затем он делает прогнозы по неизвестным данным, но он не работает. Программа предсказывает, что неизвестные данные - все пульсары или все agn, и редко предсказывает другой результат, но не правильный.
Ниже я описываю проходы моей программы.
Это создает фрейм данных с данными для всех источников: all_df Он сделан из десяти колонн, девять использовал в качестве предсказателей и один в качестве мишени:
predictors=all_df[['spec_index','variab_index','flux_density','unc_ene_flux100','sign_curve','h_ratio_12','h_ratio_23','h_ratio_34','h_ratio_45']]
targets=all_df['type']
колонок типа содержит метку «пульсарного» или «Agn» для каждого источника.
Значения предикторов и целей используются последовательно в программе для обучения лесу.
Программа делит предсказатели и цели в двух наборах - поезд, который составляет 70% от общего числа, и тест, который составляет 30% от общего числа all_df, используя функцию train_test_split от Scikit Learn :
pred_train, pred_test, tar_train, tar_test=train_test_split(predictors, targets, test_size=0.3)
Данные в этих наборах смешиваются, поэтому программа упорядочивает индексы этих множеств, не меняя позиции данных:
pred_train=pred_train.reset_index(drop=True)
pred_test=pred_test.reset_index(drop=True)
tar_train=tar_train.reset_index(drop=True)
tar_test=tar_test.reset_index(drop=True)
После этого программа создает и обучает случайный лес:
clf=RandomForestClassifier(n_estimators=1000,oob_score=True,max_features=None,max_depth=None,criterion='gini')#,random_state=1)
clf=clf.fit(pred_train,tar_train)
Теперь программа делает прогноз на тестовом наборе:
predictions=clf.predict(pred_test)
На данный момент, программа, кажется, работает.
Теперь он передает другой фрейм данных с неизвестными данными в лес, созданный выше, и у меня есть плохой результат, описанный ранее. Вы можете мне помочь? Проблема может быть смещением в randomforestclassifier, но у меня не было значимых результатов, изменяющих параметры randomforestclassifier. Если вам нужно, я могу дать дополнительные объяснения. Спасибо заранее.
Bye, Фабио
PS: Я тоже пытался перекрестной проверкой: я разделил на поезд снова установить в поезд и испытание, с теми же пропорциями (0,7 и 0,3), для создания, поезда и проверить лес прежде чем тестировать его на исходном тестовом наборе, изменив параметры randomforestclassifier, чтобы получить лучшие результаты, но у меня не было никаких улучшений.
Возможно, что распределение предикторов в вашем тестовом наборе данных не совпадает с распределением данных вашего «неизвестного» набора данных. Я бы предложил провести некоторый разведочный анализ этих распределений, прежде чем пытаться исправить вашу модель прогнозирования (которая, возможно, не была бы виновницей здесь). – Kris
Просто сделайте некоторые графики, такие как 'pred_test ['flux_density']. Plot()' и т. Д. – Kris
, поскольку @kris предложил сделать анализ распределения ответов, и если его не правильно (распределение в обучении отличается от теста), то вы можете сделать некоторые стратифицированная выборка. – abhiieor