Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

Мэдээллийн шинжлэх ухааны салбарт орж буй хүмүүс ихэнхдээ тэднийг юу хүлээж байгааг бодитойгоор хүлээдэггүй. Олон хүмүүс одоо гайхалтай мэдрэлийн сүлжээ бичиж, Iron Man-аас дуут туслах бүтээж, эсвэл санхүүгийн зах зээл дээрх бүх хүнийг ялна гэж бодож байна.
Гэхдээ ажил Өгөгдөл Эрдэмтэн нь өгөгдөлд тулгуурладаг бөгөөд хамгийн чухал бөгөөд цаг хугацаа шаардсан талуудын нэг бол өгөгдлийг мэдрэлийн сүлжээнд оруулах эсвэл тодорхой аргаар шинжлэхээс өмнө боловсруулах явдал юм.

Энэ нийтлэлд манай баг алхам алхмаар зааварчилгаа, код ашиглан өгөгдлийг хэрхэн хурдан, хялбар боловсруулах талаар тайлбарлах болно. Бид кодыг нэлээд уян хатан болгохыг хичээсэн бөгөөд өөр өөр мэдээллийн багцад ашиглах боломжтой.

Олон мэргэжилтнүүд энэ нийтлэлээс ер бусын зүйлийг олж харахгүй байж магадгүй ч эхлэгчдэд шинэ зүйл сурах боломжтой бөгөөд хурдан бөгөөд бүтэцтэй өгөгдөл боловсруулах тусдаа дэвтэр хийхийг удаан мөрөөдөж байсан хэн бүхэн кодыг хуулж, өөрөө форматлаж болно. Github-аас бэлэн дэвтэр татаж авах.

Бид мэдээллийн багцыг хүлээн авлаа. Дараа нь юу хийх вэ?

Тиймээс, стандарт: бид юу хийж байгаагаа, ерөнхий дүр зургийг ойлгох хэрэгтэй. Үүнийг хийхийн тулд бид панда ашиглан янз бүрийн өгөгдлийн төрлийг тодорхойлдог.

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 хуудас

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

Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

Баганын утгыг харцгаая:

  1. Багана тус бүрийн мөрийн тоо нь нийт мөрийн тоотой тохирч байна уу?
  2. Багана бүрийн өгөгдлийн мөн чанар юу вэ?
  3. Үүнийг урьдчилан таамаглахын тулд бид аль баганыг чиглүүлэхийг хүсч байна вэ?

Эдгээр асуултын хариулт нь танд өгөгдлийн багцад дүн шинжилгээ хийж, дараагийн үйлдлийнхээ төлөвлөгөөг гаргах боломжийг олгоно.

Мөн багана тус бүрийн утгыг нарийвчлан судлахын тулд бид pandas describe() функцийг ашиглаж болно. Гэсэн хэдий ч, энэ функцын сул тал нь мөрийн утгатай баганын тухай мэдээлэл өгдөггүй явдал юм. Бид дараа нь тэдэнтэй харьцах болно.

df.describe()

Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

Ид шидийн дүрслэл

Бидэнд ямар ч үнэт зүйл байхгүй байгааг харцгаая:

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

Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

Энэ бол дээрээс богино харагдах байдал байсан, одоо бид илүү сонирхолтой зүйл рүү шилжих болно

Бүх мөрөнд зөвхөн нэг утгатай багануудыг олж, боломжтой бол устгахыг хичээцгээе (тэдгээр нь үр дүнд ямар ч байдлаар нөлөөлөхгүй):

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 хуудас

Энд багана дотор байгаа эдгээр утгыг шараар тэмдэглэх хэрэгтэй. Одоо хөгжилтэй зүйл эхэлж байна - эдгээр үнэт зүйлстэй хэрхэн харьцах вэ? Би эдгээр утгууд эсвэл баганууд бүхий мөрүүдийг устгах ёстой юу? Эсвэл эдгээр хоосон утгыг өөр утгуудаар дүүргэх үү?

Зарчмын хувьд хоосон утгуудаар юу хийж болохыг шийдэхэд тань туслах ойролцоо диаграмм энд байна:

Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

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 номын сан эсвэл бусад ижил төстэй номын сангуудын загварыг ашиглан регрессийн загвар ашиглан тооцоолж болно. Манай баг үүнийг ойрын ирээдүйд хэрхэн хийх талаар тусдаа нийтлэл гаргах болно.

Тиймээс одоохондоо тоон өгөгдлийн тухай яриа тасрах болно, учир нь янз бүрийн даалгаварт өгөгдөл бэлтгэх, урьдчилан боловсруулах ажлыг хэрхэн илүү сайн хийх талаар өөр олон нюансууд байгаа бөгөөд тоон мэдээллийн үндсэн зүйлсийг энэ нийтлэлд авч үзсэн болно. Бид тоон үзүүлэлтээс хэд хэдэн алхам ухарсан чанарын мэдээлэл рүү буцах цаг болжээ. Та энэ дэвтрийг хүссэнээрээ өөрчилж, өөр өөр ажилд тохируулан өөрчилж болно, ингэснээр мэдээллийн урьдчилсан боловсруулалт маш хурдан явагдана!

Чанарын өгөгдөл

Үндсэндээ чанарын өгөгдлийн хувьд мөр (эсвэл объект)-ээс тоо болгон форматлахын тулд One-hot-encoding аргыг ашигладаг. Энэ цэг рүү шилжихээсээ өмнө дээрх диаграмм болон кодыг ашиглан хоосон утгуудыг авч үзье.

df_categorical.nunique()

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

Мэдээллийг хурдан боловсруулахад зориулсан Notepad-cheat хуудас

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

сэтгэгдэл нэмэх