Введение
Звезда-пульсар, излучающая пучок электромагнитного излучения, которую можно увидеть, только направив ее на Землю. В этой статье я разработал модель прогнозирования с использованием TensorFlow и Random Forest и сравнил результаты двух моделей. Результат показывает, что модели, разработанные с использованием TensorFlow и Random Forest, имеют очень высокую точность.
Набор данных и информация об атрибутах для этой разработки были получены из следующего источника и ссылки: https://archive.ics.uci.edu/ml/datasets/HTRU2 и https://www.kaggle.com/pavanraj159. / предсказание-пульсар-звезда
Д-р Роберт Лайон, Манчестерский университет, Школа физики и астрономии, Здание Алана Тьюринга, Манчестер M13 9PL, Соединенное Королевство, robert.lyon ‘@’ manchester.ac.uk
Информация о наборе данных:
HTRU2 - это набор данных, который описывает выборку кандидатов в пульсары, собранную во время Обзора Вселенной с высоким временным разрешением.
Пульсары - это редкий тип нейтронных звезд, которые производят радиоизлучение, обнаруживаемое здесь, на Земле. Они представляют значительный научный интерес как исследования пространства-времени, межзвездной среды и состояний вещества.
Когда пульсары вращаются, их луч излучения проходит по небу и, когда он пересекает наш луч зрения, создает заметную картину широкополосного радиоизлучения. Поскольку пульсары вращаются быстро, эта картина периодически повторяется. Таким образом, поиск пульсаров включает поиск периодических радиосигналов с помощью больших радиотелескопов.
Каждый пульсар излучает немного разную диаграмму направленности, которая немного меняется при каждом обороте. Таким образом, обнаружение потенциального сигнала, известное как «кандидат», усредняется по множеству оборотов пульсара, что определяется продолжительностью наблюдения. В отсутствие дополнительной информации каждый кандидат потенциально мог бы описать настоящий пульсар. Однако на практике почти все обнаружения вызваны радиочастотными помехами (RFI) и шумом, что затрудняет поиск достоверных сигналов.
Инструменты машинного обучения теперь используются для автоматической маркировки кандидатов в пульсары для облегчения быстрого анализа. В частности, широко применяются системы классификации, которые рассматривают наборы данных-кандидатов как проблемы двоичной классификации. Здесь законные примеры пульсаров представляют собой положительный класс меньшинства, а ложные примеры - отрицательный класс большинства.
Общий набор данных содержит 16 259 примеров ложных сигналов, вызванных радиочастотными помехами / шумом, и 1639 примеров реальных пульсаров. Все эти примеры проверены аннотаторами.
В каждой строке сначала перечислены переменные, а метка класса является последней записью. Используемые метки классов: 0 (отрицательный) и 1 (положительный).
Информация об атрибутах:
Каждый кандидат описывается 8 непрерывными переменными и одной переменной класса. Первые четыре представляют собой простые статистические данные, полученные из интегрированного профиля импульса (сложенный профиль). Это массив непрерывных переменных, которые описывают версию сигнала с разрешением по долготе, усредненную как по времени, так и по частоте. Остальные четыре переменные аналогично получаются из кривой DM-SNR. Они кратко изложены ниже:
- Среднее значение интегрированного профиля.
- Стандартное отклонение интегрированного профиля.
- Чрезмерный эксцесс интегрированного профиля.
- Перекос интегрированного профиля.
- Среднее значение кривой DM-SNR.
- Стандартное отклонение кривой DM-SNR.
- Избыточный эксцесс кривой DM-SNR.
- Асимметрия кривой DM-SNR.
- Класс
HTRU 2 Резюме
Всего 17 898 примеров.
1 639 положительных примеров.
16 259 отрицательных примеров.
Во время этой разработки использовалась стабильная версия TensorFlow (версия 1.14), а для модели случайного леса я использовал библиотеку scikit learn.
Импортировать библиотеки для процесса разработки
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import seaborn as sns from matplotlib import pyplot as plt from matplotlib import style %matplotlib inline # Evaluations from sklearn.metrics import classification_report,confusion_matrix # Random Forest from sklearn.ensemble import RandomForestClassifier # TensorFlow import tensorflow as tf
Чтение данных CSV с помощью pandas
pulsar_Data = pd.read_csv('pulsar_stars.csv') # Print top 5 lines of data pulsar_Data.columns
# Print all columns in the data set pulsar_Data.columns Index([' Mean of the integrated profile', ' Standard deviation of the integrated profile', ' Excess kurtosis of the integrated profile', ' Skewness of the integrated profile', ' Mean of the DM-SNR curve', ' Standard deviation of the DM-SNR curve', ' Excess kurtosis of the DM-SNR curve', ' Skewness of the DM-SNR curve', 'target_class'], dtype='object')
Чтобы использовать структуру TensorFlow, важно, чтобы в имени столбца наборов данных не было пробелов и специальных символов. Вы можете видеть ниже, имя столбца было изменено в соответствии с требованиями TensorFlow.
pulsar_Data.columns = ['Mean_of_the_integrated_profile', 'Standard_deviation_of_the_integrated_profile', 'Excess_kurtosis_of_the_integrated_profile', 'Skewness_of_the_integrated_profile', 'Mean_of_the_DM_SNR_curve', 'Standard_eviation_of_the_DM_SNR_curve', 'Excess_kurtosis_of_the_DM_SNR_curve', 'Skewness_of_the_DM_SNR_curve', 'target_class'] # Checking the presence of null values in the data set pulsar_Data.isnull().any() Mean_of_the_integrated_profile False Standard_deviation_of_the_integrated_profile False Excess_kurtosis_of_the_integrated_profile False Skewness_of_the_integrated_profile False Mean_of_the_DM_SNR_curve False Standard_eviation_of_the_DM_SNR_curve False Excess_kurtosis_of_the_DM_SNR_curve False Skewness_of_the_DM_SNR_curve False target_class False dtype: bool
Визуализация данных
График корреляции
plt.figure(figsize=(12,5)) sns.heatmap(pulsar_Data.corr(),annot=True)
Граф График цели
# Count plot for target which displays total zeros and ones sns.countplot(x='target_class', data=pulsar_Data)
Парный участок
sns.pairplot(data=pulsar_Data, hue='target_class')
Приведенные выше визуализации парных графиков показывают, что данные хорошо различаются, и модель классификации может быть разработана с использованием целевого класса. Более того, график корреляции показывает, что все особенности данных хорошо коррелированы. Итак, давайте построим модель со всеми функциями в данных.
Чтобы сделать исходные данные неповрежденными, был использован метод глубокого копирования для создания нового объекта данных.
df = pulsar_Data.copy() df.head(5)
# Print the columns after making a copy df.columns Index(['Mean_of_the_integrated_profile', 'Standard_deviation_of_the_integrated_profile', 'Excess_kurtosis_of_the_integrated_profile', 'Skewness_of_the_integrated_profile', 'Mean_of_the_DM_SNR_curve', 'Standard_eviation_of_the_DM_SNR_curve', 'Excess_kurtosis_of_the_DM_SNR_curve', 'Skewness_of_the_DM_SNR_curve', 'target_class'], dtype='object') # Function to remove target column and create a data frame from only def data_prep(df): feature_columns = df.columns[:-1] df_features = pd.DataFrame(data=df, columns=feature_columns return df_features # Calling the function data_prep to get the feature columns df_features = data_prep(df) # print top 5 lines of feature columns df_features.head()
# Spiting the data to train and test the model X = df_features.copy() y = df['target_class'].copy() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
Стандартный скалер
# Custom scaler function def standardScaling(feature): scaler = StandardScaler().fit(feature) scaled_feature = scaler.transform(feature) scaled_feat = pd.DataFrame(data = scaled_feature, columns = df_features.columns) return scaled_feat # Calling the scaler function by passing X_train and X_test to get the scaled data set X_train_scaled = standardScaling(X_train) X_test_scaled = standardScaling(X_test) # Print X_train scaled data X_train_scaled.head()
В процессе масштабирования изменяются индексы X_train и X_test. Таким образом, вы также должны сбросить индекс y_train и y_test, как показано ниже, иначе вы получите ошибку несоответствия индекса.
y_train = y_train.reset_index(drop=True) y_test = y_test.reset_index(drop=True)
TensorFlow
Программирование с помощью оценщиков
Оценщик - это высокоуровневое представление TensorFlow полной модели. Он обрабатывает детали инициализации, регистрации, сохранения и восстановления, а также многие другие функции, поэтому вы можете сосредоточиться на своей модели. Оценщик - это любой класс, производный от tf.estimator.Estimator.
Оценщик - это любой класс, производный от tf.estimator.Estimator. TensorFlow предоставляет готовые оценщики для реализации общих алгоритмов машинного обучения.
To write a TensorFlow program based on pre-made Estimators, you must perform the following tasks: 1. Define the model's feature columns 2. Instantiate an Estimator, specifying the feature columns and various hyper-parameters. 3. Create Input Function 4. Call one or more methods on the Estimator object, passing the appropriate input function as the source of the data.
Давайте применим алгоритм к набору данных о звездах пульсара.
1. Создайте функции ввода
Вы должны создать функции ввода для предоставления данных для 1. обучения, 2. оценки и 3. прогнозирования.
# Create a input function to train the model input_func_train = tf.estimator.inputs.pandas_input_fn(x=X_train_scaled,y=y_train, batch_size=50,shuffle=True) # Create a input function to evaluate the model after train input_func_test = tf.estimator.inputs.pandas_input_fn(x=X_test_scaled,y=y_test, batch_size=50,shuffle=False) # Create a input function for prediction input_func_prediction = tf.estimator.inputs.pandas_input_fn(x=X_test_scaled,y=y_test, batch_size=50,shuffle=False)
2. Столбцы характеристик
Столбец функций - это объект, описывающий, как модель должна использовать необработанные входные данные из словаря функций. Когда вы строите модель оценщика, вы передаете ей список столбцов функций, описывающих каждую из функций, которые вы хотите использовать в модели. Модуль tf.feature_column предоставляет множество вариантов для представления данных в модели.
# Get all feature columns df_features.columns Index(['Mean_of_the_integrated_profile', 'Standard_deviation_of_the_integrated_profile', 'Excess_kurtosis_of_the_integrated_profile', 'Skewness_of_the_integrated_profile', 'Mean_of_the_DM_SNR_curve', 'Standard_eviation_of_the_DM_SNR_curve', 'Excess_kurtosis_of_the_DM_SNR_curve', 'Skewness_of_the_DM_SNR_curve'], dtype='object') # Defining the model's feature columns my_feature_columns = [] for col in df_features.columns: my_feature_columns.append(tf.feature_column.numeric_column(col)) # Print feature columns my_feature_columns [NumericColumn(key='Mean_of_the_integrated_profile', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Standard_deviation_of_the_integrated_profile', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Excess_kurtosis_of_the_integrated_profile', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Skewness_of_the_integrated_profile', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Mean_of_the_DM_SNR_curve', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Standard_eviation_of_the_DM_SNR_curve', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Excess_kurtosis_of_the_DM_SNR_curve', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Skewness_of_the_DM_SNR_curve', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None)]
3. Создайте экземпляр оценщика.
Создайте экземпляр оценщика с помощью классификатора глубокой нейронной сети (DNNClassifier) tf.estimator. DNNClassifier - это предварительно созданный класс оценщика, который обучает модели классификации на основе плотных нейронных сетей с прямой связью. tf.estimator.DNNClassifier для глубоких моделей, выполняющих мультиклассовую классификацию.
# Build a DNN with 2 hidden layers and 10 nodes in each hidden #layer. classifier = tf.estimator.DNNClassifier( feature_columns=my_feature_columns, # Two hidden layers of 10 nodes each. hidden_units=[10,10], # The model must choose between 2 classes. n_classes=2 )
4. Обучите модель.
# Train the model by calling the Estimator's train method classifier.train(input_fn=input_func_train, steps=50)
Оцените обученную модель
# Evaluate the model. eval_result = classifier.evaluate(input_func_test, steps=len(X_test)) print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result)) Test set accuracy: 0.977
Прогнозирование на основе обученной модели
#prediction_fn=tf.estimator.inputs.pandas_input_fn(x=X_test, batch_size=len(X_test), shuffle=False) predictions = list(classifier.predict(input_fn=input_func_prediction)) predictions[0] {'logits': array([-5.2259927], dtype=float32), 'logistic': array([0.00534624], dtype=float32), 'probabilities': array([0.9946537 , 0.00534629], dtype=float32), 'class_ids': array([0], dtype=int64), 'classes': array([b'0'], dtype=object), 'all_class_ids': array([0, 1]), 'all_classes': array([b'0', b'1'], dtype=object) } final_predictions = [] for pred in predictions: final_predictions.append(pred['class_ids'][0])
Классификационный отчет и матрица неточностей
# Evaluations print('Classification Reprt: \n') print(classification_report(y_test,final_predictions)) print('\nConfusion Matrix: \n') print(confusion_matrix(y_test,final_predictions)) Classification Reprt: precision recall f1-score support 0 0.98 0.99 0.99 4896 1 0.93 0.80 0.86 474 micro avg 0.98 0.98 0.98 5370 macro avg 0.96 0.90 0.92 5370 weighted avg 0.98 0.98 0.98 5370 Confusion Matrix: [[4869 27] [ 95 379]]
Случайный лес
rf_model = RandomForestClassifier(n_estimators=200) rf_model.fit(X_train_scaled, y_train) RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=None, oob_score=False, random_state=None, verbose=0, warm_start=False)
Прогнозы и оценки со случайным лесом
# Prediction using Random Forest Model rf_prediction = rf_model.predict(X_test_scaled) # Evaluations print('Classification Report: \n') print(classification_report(y_test,rf_prediction)) print('\nConfusion Matrix: \n') print(confusion_matrix(y_test,rf_prediction)) Classification Report: precision recall f1-score support 0 0.98 0.99 0.99 4896 1 0.94 0.82 0.88 474 micro avg 0.98 0.98 0.98 5370 macro avg 0.96 0.91 0.93 5370 weighted avg 0.98 0.98 0.98 5370 Confusion Matrix: [[4870 26] [ 83 391]]
Вывод
Сравнение результатов моделей TensorFlow и Random Forest показывает, что точность результатов очень высока и их можно использовать для прогнозирования будущих значений. В обоих случаях нет большой разницы в точности и результатах матрицы неточностей. Итак, мы можем сделать вывод, что случайный лес для этого набора данных может быть альтернативным алгоритмом разработки модели, если кто-то не предпочитает использовать TensorFlow.
Использованная литература:
1. TensorFlow Doc (https://www.tensorflow.org/guide/premade_estimators#the_algorithm)
2. Kaggle для источника данных (https://www.kaggle.com/pavanraj159/predicting-a-pulsar-star)