ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

ብዙውን ጊዜ ወደ የውሂብ ሳይንስ መስክ የሚገቡ ሰዎች ምን እንደሚጠብቃቸው ሙሉ በሙሉ እውነተኛ ሀሳብ የላቸውም። ብዙ ሰዎች አሁን አሪፍ የነርቭ አውታረ መረቦችን እንደሚጽፉ፣ ከአይረን ሰው የድምጽ ረዳት እንደሚፈጥሩ ወይም ሁሉንም በፋይናንሺያል ገበያዎች እንደሚመታ ያስባሉ።
ግን ስራ መረጃ ሳይንቲስት በመረጃ ላይ የተመሰረተ ነው, እና በጣም አስፈላጊ እና ጊዜን ከሚወስዱ ጊዜዎች ውስጥ አንዱ ወደ ነርቭ አውታረመረብ ከመመገቡ በፊት ወይም በተወሰነ መንገድ ከመተንተን በፊት የውሂብ ሂደት ነው.

በዚህ ጽሑፍ ውስጥ ቡድናችን እንዴት በቀላሉ እና በፍጥነት ውሂብን በደረጃ መመሪያዎች እና በኮድ ማካሄድ እንደሚችሉ ይገልፃል። ኮዱን በጣም ተለዋዋጭ ለማድረግ ሞክረናል እና ለተለያዩ የውሂብ ስብስቦች ሊያገለግል ይችላል።

ብዙ ባለሙያዎች በዚህ ጽሑፍ ውስጥ ምንም ያልተለመደ ነገር ላያገኙ ይችላሉ ፣ ግን ጀማሪዎች አዲስ ነገር መማር ይችላሉ ፣ እና ማንኛውም ሰው ለፈጣን እና ለተዋቀረ የውሂብ ሂደት የተለየ ማስታወሻ ደብተር ለመስራት ህልም ያለው ማንኛውም ሰው ኮዱን ገልብጦ ለራሱ መቅረጽ ይችላል ፣ ወይም የተጠናቀቀውን ማስታወሻ ደብተር ከ Github ያውርዱ።

የውሂብ ስብስብ ደርሷል። ቀጥሎ ምን ይደረግ?

ስለዚህ, መስፈርቱ: እኛ የምንገናኝበትን, ትልቁን ምስል መረዳት አለብዎት. ለዚህ፣ የተለያዩ የውሂብ አይነቶችን በቀላሉ ለመግለጽ ፓንዳዎችን እንጠቀማለን።

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

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

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

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

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

የአምዶችን እሴቶች እንይ፡-

  1. በእያንዳንዱ አምድ ውስጥ ያሉት የመስመሮች ብዛት ከጠቅላላው የመስመሮች ብዛት ጋር ይዛመዳል?
  2. በእያንዳንዱ አምድ ውስጥ ያለው የመረጃው ይዘት ምንድን ነው?
  3. ለእሱ ትንበያ ለመስጠት የትኛውን አምድ ዒላማ ማድረግ እንፈልጋለን?

የእነዚህ ጥያቄዎች መልሶች የመረጃ ቋቱን ለመተንተን እና ለሚቀጥሉት ደረጃዎች እቅድ ለማውጣት ያስችሉዎታል።

እንዲሁም፣ በእያንዳንዱ አምድ ውስጥ ያሉትን እሴቶች በጥልቀት ለማየት፣ የፓንዳስ መግለጫ() ተግባርን መጠቀም እንችላለን። እውነት ነው, የዚህ ተግባር ጉዳቱ ስለ ሕብረቁምፊ እሴቶች ስለ አምዶች መረጃ አለመስጠቱ ነው. በኋላ እናስተናግዳቸዋለን።

df.describe()

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

Magic Visualization

ምንም ዋጋ የሌለንበትን ቦታ እንይ፡-

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

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

ከላይ ትንሽ እይታ ነበር, አሁን ወደ ይበልጥ አስደሳች ነገሮች እንቀጥላለን.

በሁሉም ረድፎች ውስጥ አንድ እሴት ብቻ ያላቸውን አምዶች ለማግኘት እና ከተቻለ ለመሰረዝ እንሞክር (በምንም መልኩ ውጤቱን አይነኩም)

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']) #добавляем третью колонку-шпион в качественные данные

በመጨረሻም የቁጥር መረጃዎችን ከጥራት መረጃ ሙሉ ለሙሉ ለይተናል እና አሁን ከእነሱ ጋር በትክክል መስራት እንችላለን። የመጀመሪያው ነገር ባዶ እሴቶች የት እንዳለን መረዳት ነው (ናኤን ፣ እና በአንዳንድ ሁኔታዎች 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()

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

እዚህ ፣ በጠፉት አምዶች ውስጥ ያሉት እሴቶች በቢጫ ምልክት መደረግ አለባቸው። እና ደስታው አሁን ይጀምራል - በእነዚህ እሴቶች እንዴት መሆን እንደሚቻል? በእነዚህ እሴቶች ወይም አምዶች መስመሮች ይሰረዙ? ወይም እነዚህን ባዶ እሴቶች ከሌሎች አንዳንድ ጋር ይሙሉ?

በባዶ ዋጋዎች ምን ማድረግ እንደሚችሉ ለማወቅ የሚረዳዎት ረቂቅ ንድፍ ይኸውና፡

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

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. በሌላ ሞዴል የተሰላ እሴት ያስገቡ

አንዳንድ ጊዜ ዋጋዎች ከስኪሌርን ቤተ-መጽሐፍት ወይም ሌሎች ተመሳሳይ ቤተ-መጻሕፍት ሞዴሎችን በመጠቀም የመመለሻ ሞዴሎችን በመጠቀም ሊሰሉ ይችላሉ። ቡድናችን ይህ እንዴት በቅርብ ጊዜ ውስጥ ሊከናወን እንደሚችል የተለየ ጽሑፍ ይመርጣል።

ስለዚህ ፣ ስለ አኃዛዊ መረጃ ታሪክ የሚቋረጥ ቢሆንም ፣ ምክንያቱም የውሂብ ዝግጅት እና ለተለያዩ ተግባራት ቅድመ-ዝግጅት እንዴት በተሻለ ሁኔታ ማከናወን እንደሚቻል ሌሎች ብዙ ልዩነቶች አሉ ፣ እና ለቁጥር መረጃ መሰረታዊ ነገሮች በዚህ ጽሑፍ ውስጥ ተወስደዋል ፣ እና አሁን ወደ የጥራት ውሂብ የምንመለስበት ጊዜ፣ ይህም ከቁጥራዊዎቹ ጥቂት ደረጃዎችን ወደ ኋላ ለይተናል። ይህን ማስታወሻ ደብተር በፈለከው መንገድ መቀየር ትችላለህ፣ ከተለያዩ ስራዎች ጋር በማስተካከል የውሂብ ቅድመ ማቀናበር በጣም በፍጥነት ይሄዳል!

ጥራት ያለው መረጃ

በመሠረቱ፣ ለጥራት መረጃ፣ ከሕብረቁምፊ (ወይም ነገር) ወደ ቁጥር ለመቅረጽ አንድ-ሆት-ኢንኮዲንግ ዘዴ ጥቅም ላይ ይውላል። ወደዚህ ነጥብ ከመሄዳችን በፊት ባዶ እሴቶችን ለመቋቋም ከላይ ያለውን ሼማ እና ኮድ እንጠቀም።

df_categorical.nunique()

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

ለፈጣን ውሂብ ቅድመ ሂደት የማስታወሻ ደብተር ማጭበርበር ሉህ

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)

የውሂብ ስብስቦችን አንድ ላይ ካገናኘን በኋላ፣ መጨረሻ ላይ MinMaxScalerን ከስክሌርን ቤተ-መጽሐፍት በመጠቀም የመረጃ ለውጥን መጠቀም እንችላለን። ይህ እሴቶቻችንን በ 0 እና 1 መካከል ያደርገዋል, ይህም ለወደፊቱ ሞዴሉን ሲያሰለጥን ይረዳል.

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

ይህ ውሂብ አሁን ለማንኛውም ነገር ዝግጁ ነው - ለነርቭ አውታረ መረቦች ፣ መደበኛ ኤምኤል ስልተ ቀመሮች ፣ ወዘተ!

በዚህ ጽሑፍ ውስጥ ፣ ከተከታታይ ጊዜ ጋር በተዛመደ መረጃ መስራትን ከግምት ውስጥ አላስገባንም ፣ ምክንያቱም ለእንደዚህ ዓይነቱ መረጃ እንደ ተግባርዎ ትንሽ የተለየ የማስኬጃ ቴክኒኮችን መጠቀም አለብዎት ። ለወደፊቱ ቡድናችን ለዚህ ርዕስ የተለየ ጽሑፍ ይሰጣል ፣ እና እንደዚህ ያለ አስደሳች ፣ አዲስ እና ጠቃሚ ነገር ወደ ህይወቶ ማምጣት እንደሚችል ተስፋ እናደርጋለን።

ምንጭ: hab.com

አስተያየት ያክሉ