Введение
Звезда-пульсар, излучающая пучок электромагнитного излучения, которую можно увидеть, только направив ее на Землю. В этой статье я разработал модель прогнозирования с использованием 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)