2016-08-17 3 views
0

Я написал программу на 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, чтобы получить лучшие результаты, но у меня не было никаких улучшений.

+0

Возможно, что распределение предикторов в вашем тестовом наборе данных не совпадает с распределением данных вашего «неизвестного» набора данных. Я бы предложил провести некоторый разведочный анализ этих распределений, прежде чем пытаться исправить вашу модель прогнозирования (которая, возможно, не была бы виновницей здесь). – Kris

+0

Просто сделайте некоторые графики, такие как 'pred_test ['flux_density']. Plot()' и т. Д. – Kris

+0

, поскольку @kris предложил сделать анализ распределения ответов, и если его не правильно (распределение в обучении отличается от теста), то вы можете сделать некоторые стратифицированная выборка. – abhiieor

ответ

0

Спасибо, что ответили, ребята.

Как и было предложено, я сделал графики предикторов в «тестовых» данных и в «неизвестных» данных; распределения, как правило, аналогичны, но я предпочитаю делать гистограммы, чтобы сказать это.Так что я попытался сделать гистограммы, но я не как для тестирования и неизвестных данных, могу с помощью:

pylab.hist(unid_df.spec_index,bins=30) 

я получил: TypeError: LEN() из некалиброванного объекта

Я не нашел решение еще, и я не знаю, может ли эта ошибка отрицательно повлиять на прогнозы.

Дополнительная информация: диапазоны различных предикторов имеют разный порядок величины. Диапазоны одинаковы для соответствующих предикторов тестовых и неизвестных данных, но в некоторых случаях диапазоны тестовых данных имеют больший порядок величины от соответствующего предиктора неизвестных данных. Это связано с некоторыми моментами, значения которых намного больше, чем большинство других точек в наборе.

Еще раз спасибо. Bye, Fabio