Фон
Поскольку я пытаюсь подать заявку на работу специалиста по данным, я недавно присоединился к программе Udacity «Стать специалистом по данным в области нанотехнологий».
Для первого проекта мне нужно проанализировать набор данных и поделиться своим анализом на Medium.
Начиная
Я решил использовать этот шанс, чтобы поделиться тем, что я узнал из этой удивительной книги. (Настоятельно рекомендуется!)
Как компании, выпускающие кредитные карты, могут обнаруживать мошеннические операции?
Обзор данных
«Реальный набор данных содержит транзакции по кредитным картам европейских держателей карт в сентябре 2013 года. В этом наборе данных 492 случая мошенничества из 284 807 транзакций. Набор данных сильно несбалансирован, на положительный класс (мошенничество) приходится 0,172% всех транзакций.
- «Время» содержит секунды, прошедшие между каждой транзакцией.
- Характеристики V1, V2, … V28 являются основными компонентами, полученными с помощью PCA.
- «Сумма» — это сумма транзакции, эту функцию можно использовать, например, для зависимого от затрат обучения.
- «Класс» — это переменная ответа, которая принимает значение 1 в случае мошенничества и 0 в противном случае.
data.head()
data.shape
Генерировать сводную статистику
# describes the data, column by column. data.describe()
data.columns
# The total number of positive labels, or fraudulent transactions data[‘Class’].sum()
Определение нечисловых значений по признаку
nanCounter = np.isnan(data).sum()
Определение различных значений по функциям
У нас есть 124 592 различных временных метки. Однако всего насчитывается 284 807 наблюдений. Это означает, что существует несколько транзакций в некоторые временные метки.
Сгенерируйте матрицу признаков и массив меток
# Create the feature matrix X and the labels array Y dataX = data.copy().drop([‘Class’],axis=1)
dataY = data[‘Class’].copy()
Стандартизируйте матрицу признаков X
# Rescale the feature matrix so that each feature, except for time, has a mean of zero and standard deviation of one featuresToScale = dataX.drop([‘Time’],axis=1).columns sX = pp.StandardScaler(copy=True) dataX.loc[:,featuresToScale] = sX.fit_transform(dataX[featuresToScale]) dataX.describe()
Разработка функций и выбор функций
- «Выбор признаков не требуется, поскольку количество наблюдений (284 807) значительно превышает количество признаков (30), что значительно снижает вероятность переобучения».
Проверить корреляцию признаков
correlationMatrix = pd.DataFrame(data=[],index=dataX.columns, columns=dataX.columns) for i in dataX.columns: for j in dataX.columns: correlationMatrix.loc[i,j] = np.round(pearsonr(dataX.loc[:,i], dataX.loc[:,j])[0],2)
Визуализация данных
count_classes = pd.value_counts(data[‘Class’],sort=True).sort_index() ax = sns.barplot( x = count_classes.index, y = count_classes/len(data)) ax.set_title(‘Frequency Percentage by Class’) ax.set_xlabel(‘Class’) ax.set_ylabel(‘Frequency Percentage’)
График просто показывает, насколько несбалансирован набор данных.
Продолжение следует!
В следующей статье я расскажу о подготовке моделей и построении моделей машинного обучения! Следите за обновлениями!