වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

බොහෝ විට දත්ත විද්‍යා ක්ෂේත්‍රයට ඇතුළු වන පුද්ගලයින්ට ඔවුන් අපේක්ෂා කරන දේ පිළිබඳ යථාර්ථවාදී අපේක්ෂාවන්ට වඩා අඩුය. බොහෝ අය සිතන්නේ දැන් ඔවුන් සිසිල් ස්නායුක ජාල ලිවීමට, අයන් මෑන් වෙතින් හඬ සහායකයකු නිර්මාණය කිරීමට හෝ මූල්‍ය වෙලඳපොලවල සිටින සියල්ලන් පරාජය කරනු ඇති බවයි.
නමුත් වැඩ කරන්න දත්ත විද්‍යාඥයා දත්ත මත පදනම් වන අතර, වඩාත් වැදගත් හා කාලය ගතවන අංගයක් වන්නේ දත්ත ස්නායුක ජාලයකට පෝෂණය කිරීමට හෝ යම් ආකාරයකට විශ්ලේෂණය කිරීමට පෙර එය සැකසීමයි.

මෙම ලිපියෙන්, අපගේ කණ්ඩායම ඔබට පියවරෙන් පියවර උපදෙස් සහ කේතය සමඟ ඉක්මනින් සහ පහසුවෙන් දත්ත සැකසිය හැකි ආකාරය විස්තර කරනු ඇත. අපි කේතය තරමක් නම්‍යශීලී කිරීමට උත්සාහ කළ අතර විවිධ දත්ත කට්ටල සඳහා භාවිතා කළ හැක.

බොහෝ වෘත්තිකයන්ට මෙම ලිපියේ අසාමාන්‍ය දෙයක් සොයාගත නොහැකි විය හැකි නමුත් ආරම්භකයින්ට අලුත් දෙයක් ඉගෙන ගැනීමට හැකි වනු ඇත, වේගවත් හා ව්‍යුහගත දත්ත සැකසීම සඳහා වෙනම සටහන් පොතක් සෑදීමට දිගු කලක් සිහින මැවූ ඕනෑම කෙනෙකුට කේතය පිටපත් කර එය තමන්ටම හැඩගස්වා ගත හැකිය. Github වෙතින් නිමි සටහන් පොත බාගන්න.

අපට දත්ත කට්ටලය ලැබුණා. ඊළඟට කුමක් කළ යුතුද?

එබැවින්, සම්මතය: අප කටයුතු කරන්නේ කුමක් ද යන්න තේරුම් ගත යුතුය, සමස්ත පින්තූරය. මෙය සිදු කිරීම සඳහා, අපි විවිධ දත්ත වර්ග සරලව අර්ථ දැක්වීමට pandas භාවිතා කරමු.

import pandas as pd #импортируем pandas
import numpy as np  #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df

df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

df.info() #Демонстрируем информацию о колонках

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

තීරු අගයන් දෙස බලමු:

  1. එක් එක් තීරුවේ ඇති පේළි ගණන මුළු පේළි ගණනට අනුරූප වේද?
  2. එක් එක් තීරුවේ දත්තවල සාරය කුමක්ද?
  3. ඒ සඳහා පුරෝකථනය කිරීම සඳහා අපට ඉලක්ක කිරීමට අවශ්‍ය කුමන තීරුවද?

මෙම ප්‍රශ්නවලට පිළිතුරු ඔබට දත්ත කට්ටලය විශ්ලේෂණය කිරීමට සහ ඔබේ ඊළඟ ක්‍රියාවන් සඳහා දළ වශයෙන් සැලැස්මක් ඇඳීමට ඉඩ සලසයි.

එසේම, එක් එක් තීරුවේ අගයන් ගැඹුරින් බැලීම සඳහා, අපට pandas description() ශ්‍රිතය භාවිතා කළ හැක. කෙසේ වෙතත්, මෙම ශ්‍රිතයේ අවාසිය නම් එය තන්තු අගයන් සහිත තීරු පිළිබඳ තොරතුරු ලබා නොදීමයි. අපි ඔවුන් සමඟ පසුව කටයුතු කරමු.

df.describe()

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

මැජික් දෘශ්‍යකරණය

අපට කිසිසේත්ම අගයන් නොමැති තැන් බලමු:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

මෙය ඉහළින් කෙටි බැල්මක් විය, දැන් අපි වඩාත් රසවත් දේවල් වෙත යන්නෙමු

අපි සොයා ගැනීමට උත්සාහ කරමු, හැකි නම්, සියලුම පේළිවල එක් අගයක් පමණක් ඇති තීරු ඉවත් කරන්න (ඒවා ප්‍රතිඵලයට කිසිම ආකාරයකින් බලපාන්නේ නැත):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

දැන් අපි අපවම සහ අපගේ ව්‍යාපෘතියේ සාර්ථකත්වය අනුපිටපත් රේඛා වලින් ආරක්ෂා කරමු (පවතින පේළි වලින් එකකට සමාන අනුපිළිවෙලකට එකම තොරතුරු අඩංගු රේඛා):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

අපි දත්ත කට්ටලය දෙකකට බෙදන්නෙමු: එකක් ගුණාත්මක අගයන් සහ අනෙක ප්‍රමාණාත්මක ඒවා සමඟ

මෙන්න අපි කුඩා පැහැදිලි කිරීමක් කළ යුතුයි: ගුණාත්මක හා ප්‍රමාණාත්මක දත්තවල නැතිවූ දත්ත සහිත රේඛා එකිනෙක හා සම්බන්ධ නොවේ නම්, අප කැප කරන්නේ කුමක්ද යන්න තීරණය කිරීමට අපට අවශ්‍ය වනු ඇත - නැතිවූ දත්ත සහිත සියලුම රේඛා, ඒවායින් කොටසක් පමණි, හෝ ඇතැම් තීරු. රේඛා සහසම්බන්ධ නම්, දත්ත කට්ටලය දෙකට බෙදීමට අපට සම්පූර්ණ අයිතිය ඇත. එසේ නොමැතිනම්, ඔබට ප්රථමයෙන් ගුණාත්මක හා ප්රමාණාත්මකව අතුරුදහන් වූ දත්ත සහසම්බන්ධ නොවන රේඛා සමඟ කටයුතු කිරීමට අවශ්ය වනු ඇත, පසුව පමණක් දත්ත කට්ටලය දෙකකට බෙදන්න.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

අපි මෙය කරන්නේ අපට මෙම විවිධ දත්ත වර්ග දෙක සැකසීම පහසු කිරීමටයි - මෙය අපගේ ජීවිතය කෙතරම් පහසු කරයිද යන්න පසුව අපට වැටහෙනු ඇත.

අපි ප්‍රමාණාත්මක දත්ත සමඟ වැඩ කරන්නෙමු

අප කළ යුතු පළමු දෙය නම් ප්‍රමාණාත්මක දත්තවල “ඔත්තු තීරු” තිබේද යන්න තීරණය කිරීමයි. අපි මෙම තීරු ලෙස හඳුන්වන්නේ ඒවා ප්‍රමාණාත්මක දත්ත ලෙස ඉදිරිපත් වන නමුත් ගුණාත්මක දත්ත ලෙස ක්‍රියා කරන බැවිනි.

අපි ඔවුන්ව හඳුනා ගන්නේ කෙසේද? ඇත්ත වශයෙන්ම, ඒ සියල්ල ඔබ විශ්ලේෂණය කරන දත්තවල ස්වභාවය මත රඳා පවතී, නමුත් සාමාන්යයෙන් එවැනි තීරු කුඩා අද්විතීය දත්ත තිබිය හැක (අද්විතීය අගයන් 3-10 කලාපයේ).

print(df_numerical.nunique())

අපි ඔත්තු තීරු හඳුනා ගත් පසු, අපි ඒවා ප්‍රමාණාත්මක දත්තවල සිට ගුණාත්මක දත්ත වෙත ගෙන යන්නෙමු:

spy_columns = df_numerical[['колонка1', 'колока2', 'колонка3']]#выделяем колонки-шпионы и записываем в отдельную dataframe
df_numerical.drop(labels=['колонка1', 'колока2', 'колонка3'], axis=1, inplace = True)#вырезаем эти колонки из количественных данных
df_categorical.insert(1, 'колонка1', spy_columns['колонка1']) #добавляем первую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка2', spy_columns['колонка2']) #добавляем вторую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка3', spy_columns['колонка3']) #добавляем третью колонку-шпион в качественные данные

අවසාන වශයෙන්, අපි ගුණාත්මක දත්ත වලින් ප්‍රමාණාත්මක දත්ත සම්පූර්ණයෙන්ම වෙන් කර ඇති අතර දැන් අපට එය සමඟ නිසි ලෙස වැඩ කළ හැකිය. පළමු දෙය නම් අපට හිස් අගයන් ඇත්තේ කොතැනදැයි තේරුම් ගැනීමයි (NaN, සහ සමහර අවස්ථාවලදී 0 හිස් අගයන් ලෙස පිළිගනු ලැබේ).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

මෙම අවස්ථාවෙහිදී, ශුන්‍ය මඟින් නැතිවූ අගයන් දැක්විය හැක්කේ කුමන තීරුවලද යන්න තේරුම් ගැනීම වැදගත්ය: මෙය දත්ත රැස් කළ ආකාරය නිසාද? නැතහොත් එය දත්ත අගයන් හා සම්බන්ධ විය හැකිද? මෙම ප්‍රශ්නවලට පිළිතුරු සැපයිය යුත්තේ එක් එක් සිද්ධිය අනුවය.

එබැවින්, ශුන්‍ය ඇති තැන්වල දත්ත අපට අස්ථානගත විය හැකි බව අපි තවමත් තීරණය කරන්නේ නම්, මෙම නැතිවූ දත්ත සමඟ පසුව වැඩ කිරීම පහසු කිරීම සඳහා අපි බිංදුව NaN සමඟ ප්‍රතිස්ථාපනය කළ යුතුය:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

දැන් අපි බලමු අපට දත්ත මග හැරෙන්නේ කොතැනදැයි:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

මෙහි නැති වූ තීරු ඇතුළත එම අගයන් කහ පැහැයෙන් සලකුණු කළ යුතුය. දැන් විනෝදය ආරම්භ වේ - මෙම අගයන් සමඟ කටයුතු කරන්නේ කෙසේද? මම මෙම අගයන් හෝ තීරු සහිත පේළි මකා දැමිය යුතුද? නැතහොත් මෙම හිස් අගයන් වෙනත් ඒවා සමඟ පුරවන්නද?

හිස් අගයන් සමඟ ප්‍රතිපත්තිමය වශයෙන් කුමක් කළ හැකිද යන්න තීරණය කිරීමට ඔබට උපකාර කළ හැකි ආසන්න රූප සටහනක් මෙන්න:

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

0. අනවශ්‍ය තීරු ඉවත් කරන්න

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. මෙම තීරුවේ හිස් අගයන් ගණන 50% ට වඩා වැඩිද?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. හිස් අගයන් සහිත රේඛා මකන්න

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1 අහඹු අගයක් ඇතුළත් කිරීම

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2 නියත අගයක් ඇතුළත් කිරීම

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>") #вставляем определенное значение с помощью SimpleImputer
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.3 සාමාන්ය හෝ නිතර නිතර අගය ඇතුල් කරන්න

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вместо mean можно также использовать most_frequent
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.4 වෙනත් ආකෘතියකින් ගණනය කළ අගය ඇතුල් කරන්න

සමහර විට අගයන් sklearn පුස්තකාලයේ හෝ වෙනත් සමාන පුස්තකාලවල ආකෘති භාවිතා කරමින් ප්‍රතිගාමී ආකෘති භාවිතයෙන් ගණනය කළ හැක. නුදුරු අනාගතයේ දී මෙය කළ හැකි ආකාරය පිළිබඳ අපගේ කණ්ඩායම වෙනම ලිපියක් කැප කරනු ඇත.

එබැවින්, දැනට, ප්‍රමාණාත්මක දත්ත පිළිබඳ ආඛ්‍යානය බාධා කරනු ඇත, මන්ද විවිධ කාර්යයන් සඳහා දත්ත සකස් කිරීම සහ පෙර සැකසුම් වඩා හොඳින් කරන්නේ කෙසේද යන්න පිළිබඳ තවත් බොහෝ සූක්ෂ්මතා ඇති අතර ප්‍රමාණාත්මක දත්ත සඳහා මූලික කරුණු මෙම ලිපියෙන් සැලකිල්ලට ගෙන ඇත, සහ දැන් අපි ප්‍රමාණාත්මක දත්ත වලින් පියවර කිහිපයක් පසුපසට වෙන් කළ ගුණාත්මක දත්ත වෙත ආපසු යාමට කාලයයි. ඔබට මෙම සටහන් පොත ඔබට අවශ්‍ය පරිදි වෙනස් කළ හැකිය, එය විවිධ කාර්යයන් සඳහා අනුවර්තනය කිරීම, එවිට දත්ත පෙර සැකසුම් ඉතා ඉක්මනින් සිදු වේ!

ගුණාත්මක දත්ත

මූලික වශයෙන්, ගුණාත්මක දත්ත සඳහා, එක්-උණුසුම්-කේතන ක්රමය භාවිතා කරනුයේ එය තන්තුවකින් (හෝ වස්තුවකින්) අංකයකට සංයුති කිරීම සඳහාය. මෙම ස්ථානයට යාමට පෙර, හිස් අගයන් සමඟ කටයුතු කිරීමට ඉහත රූප සටහන සහ කේතය භාවිතා කරමු.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

වේගවත් දත්ත පෙර සැකසුම් සඳහා Notepad-cheat Sheet

0. අනවශ්‍ය තීරු ඉවත් කරන්න

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. මෙම තීරුවේ හිස් අගයන් ගණන 50% ට වඩා වැඩිද?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. හිස් අගයන් සහිත රේඛා මකන්න

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1 අහඹු අගයක් ඇතුළත් කිරීම

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2 නියත අගයක් ඇතුළත් කිරීම

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True)

එබැවින්, අපට අවසානයේ ගුණාත්මක දත්තවල ශුන්‍ය පිළිබඳ හසුරුවක් ලැබී ඇත. ඔබගේ දත්ත ගබඩාවේ ඇති අගයන් මත එක්-උණුසුම්-කේතනයක් සිදු කිරීමට දැන් කාලයයි. ඔබේ ඇල්ගොරිතමයට උසස් තත්ත්වයේ දත්ත වලින් ඉගෙන ගත හැකි බව සහතික කිරීමට මෙම ක්‍රමය බොහෝ විට භාවිතා වේ.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["колонка1","колонка2","колонка3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

එබැවින්, අපි අවසානයේ වෙනම ගුණාත්මක සහ ප්‍රමාණාත්මක දත්ත සැකසීම අවසන් කර ඇත - ඒවා නැවත ඒකාබද්ධ කිරීමට කාලය

new_df = pd.concat([df_numerical,df_categorical], axis=1)

අපි දත්ත කට්ටල එකකට ඒකාබද්ධ කළ පසු, අපට අවසානයේ sklearn පුස්තකාලයෙන් MinMaxScaler භාවිතයෙන් දත්ත පරිවර්තනය භාවිතා කළ හැකිය. මෙය අපගේ අගයන් 0 සහ 1 අතර බවට පත් කරනු ඇත, එය අනාගතයේදී ආකෘතිය පුහුණු කිරීමේදී උපකාරී වනු ඇත.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

මෙම දත්ත දැන් ඕනෑම දෙයක් සඳහා සූදානම් - ස්නායුක ජාල, සම්මත ML ඇල්ගොරිතම, ආදිය!

මෙම ලිපියේදී, අපි කාල ශ්‍රේණි දත්ත සමඟ වැඩ කිරීම සැලකිල්ලට නොගත්තේය, මන්ද එවැනි දත්ත සඳහා ඔබ ඔබේ කාර්යය අනුව තරමක් වෙනස් සැකසුම් ක්‍රම භාවිතා කළ යුතුය. අනාගතයේදී, අපගේ කණ්ඩායම මෙම මාතෘකාව සඳහා වෙනම ලිපියක් කැප කරනු ඇති අතර, එය ඔබගේ ජීවිතයට රසවත්, නව සහ ප්‍රයෝජනවත් දෙයක් ගෙන ඒමට හැකි වනු ඇතැයි අපි බලාපොරොත්තු වෙමු.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න