Новый туториал по созданию историй с анализом и визуализацией данных с использованием набора данных Gender Recognition by Voice от Kaggle.

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

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

Как обычно, мы импортируем важные библиотеки

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
#model selection
from sklearn.model_selection import train_test_split
from sklearn.metrics import  accuracy_score,precision_score,recall_score,confusion_matrix,roc_curve,roc_auc_score
from sklearn.model_selection import GridSearchCV
#preprocess.
from sklearn.preprocessing import MinMaxScaler,StandardScaler,LabelEncoder,OneHotEncoder
from sklearn.impute import SimpleImputer
warnings.filterwarnings('ignore')

Чтение нашего набора данных во фрейм данных pandas и отображение формы

df_train= pd.read_csv('/kaggle/input/voicegender/voice.csv')
df_train.shape

ЭДА

Наш набор данных содержит 21 столбец и 3168 экземпляров или строк, давайте проверим имена столбцов.

df_train.columns

Это список из 21 имени столбца: ['meanfreq', 'sd', 'медиана', 'Q25', 'Q75', 'IQR', 'skew', 'kurt', 'sp.ent', 'sfm' , 'mode', 'centroid', 'meanfun', 'minfun', 'maxfun',
'meandom', 'mindom', 'maxdom', 'dfrange', 'modindx', 'label']

Со страницы описание мы знаем, чему соответствует каждый столбец.

Затем я проверил нули и не нашел их.

Я создал две функции, которые могут облегчить мою работу, чтобы я не повторял код. Первая — проверка выбросов в столбце (выбросы — это значения, которые не вписываются в распределение, поскольку они слишком велики или слишком малы и вызывают шум) Я использовал правило 1,5 IQR, вы можете проверить эту статью для лучшей демонстрации



Почему «1,5 в IQR-методе обнаружения выбросов?
Если вы не можете объяснить это шестилетнему ребенку, вы сами этого не понимаете.навстречу datascience.com»



def check_outliers(col):
    q1,q3=df[col].quantile([0.25,0.75])
    iqr=q3-q1
    rang=1.5*iqr
    return(q1-rang,q3+rang)

Другая функция предназначена для создания блочной диаграммы и диаграммы распределения для данного столбца.

def plot(col):
    fig,axes=plt.subplots(1,2)
    sns.boxplot(data=df,x=col,ax=axes[0])
    sns.distplot(a=df[col],ax=axes[1],color='#ff4125')
    fig.set_size_inches(15,5)
    lower,upper = check_outliers(col)
    l=[df[col] for i in df[col] if i>lower and i<upper] 
    print("Number of data points remaining if outliers removed : ",len(l))

Одномерный анализ

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

plot('meanfreq')
#Number of data points remaining if outliers removed :  3104

  1. Из диаграммы мы видим, что у нас есть некоторые выбросы со средней частотой менее примерно 0,11, а также большинство выбросов находятся слева от распределения.
  2. Из графика распределения мы знаем, что это нормальное распределение с небольшой асимметрией -ve, которую мы можем нормализовать позже.

Потом нарисую другие интересные колонки

plot('sd')
#Number of data points remaining if outliers removed :

plot('median')
#Number of data points remaining if outliers removed :  3059

plot('Q25')

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

Кроме того, следует отметить, что наши данные сбалансированы, что означает, что оба класса содержат равное или почти равное количество экземпляров, что часто не соответствует реальным наборам данных.

sns.countplot(data=df,x='label');

Двумерный анализ

Здесь мы сравниваем два столбца друг с другом, сначала для облегчения предсказания, позже я закодировал метки.

df['label']=df['label'].replace({'male':1,'female':0})

Я начал с создания тепловой карты, чтобы показать корреляцию между каждым атрибутом и другими.

# correlation heatmap 
cor_mat= df[:].corr()
mask = np.array(cor_mat)
mask[np.tril_indices_from(mask)] = False
fig=plt.gcf()
fig.set_size_inches(30,12)
sns.heatmap(data=cor_mat,mask=mask,square=True,annot=True,cbar=True)

  1. IQR — это функция, наиболее коррелирующая с целевой меткой.
  2. медиана и центроид, средняя частота и центроид ›› удалить центроид, поскольку сильно коррелированные признаки часто считаются избыточными
  3. другие наблюдения, есть слабые корреляции и высокие, я удалю некоторые столбцы в разработке признаков.

Чтобы построить несколько столбцов по отношению к цели, я создал новую функцию

def plot_against_target(feature):
    sns.factorplot(data=df,y=feature,x='label',kind='box')
    fig=plt.gcf()
    fig.set_size_inches(7,7)
plot_against_target('meanfreq')

Мы можем сделать вывод, что женщины имеют более высокую частоту голоса по сравнению с мужчинами, что является хорошо известным фактом!

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

g=sns.PairGrid(df[['meanfreq','sd','median','Q25','IQR','sp.ent','sfm','meanfun','label']], hue = "label")
g = g.map(plt.scatter).add_legend()

Разработка функций

1- удаление выбросов ^^

for col in df.columns:
    l,u=check_outliers(col)
    df=df[(df[col]>l)&(df[col]<u)]

после удаления выбросов мы потеряли почти 50% набора данных, поэтому я перевернул эту часть и оставил их.

2- В соответствии с графиками мы удалим некоторые столбцы «skew, Kurt, mindom, maxdom, centroid», поскольку они сильно коррелируют с другими.

temp_df=df.copy()
temp_df.drop(['skew','kurt','mindom','maxdom','centroid'],axis=1,inplace=True)

3- Создайте новые функции

Объединение уже существующих функций в более сильные является обычной практикой в ​​FE. Я создал одну новую функцию под названием pear_skew следующим образом.

temp_df['pear_skew']=temp_df['meanfreq']-temp_df['mode']
temp_df['pear_skew']=temp_df['pear_skew']/temp_df['sd']

Затем я изменил средний столбец на 1/3 (2*среднее + мода), что является эмпирическим отношением.

temp_df['meanfreq']=temp_df['meanfreq'].apply(lambda x:x*2)
temp_df['median']=temp_df['meanfreq']+temp_df['mode']
temp_df['median']=temp_df['median'].apply(lambda x:x/3)

4- Масштабирование

Я использовал Sklearn StandardScaler для нормализации данных, он работает путем вычитания среднего и деления на стандартное отклонение.

scaler=StandardScaler()
scaled_df=scaler.fit_transform(temp_df.drop('label',axis=1))

Моделирование машинного обучения

Наконец легкая часть! создавая модели ML, я использовал параметры моделей по умолчанию.

1- Отделите цель от функций и создайте разделение обучения/тестирования.

X=scaled_df
Y=df['label'].values
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.20,random_state=42)

2- Я создал 8 разных моделей, чтобы сравнить результаты.

В заключение, эта работа была больше посвящена анализу, чем ML-моделированию, вы можете проверить исходный блокнот здесь.