Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

Is minic a bhíonn ionchais níos lú ná réalaíocha ag daoine a théann isteach i réimse na hEolaíochta Sonraí maidir lena bhfuil ag fanacht leo. Síleann go leor daoine go scríobhfaidh siad líonraí neural fionnuar anois, go gcruthóidh siad cúntóir gutha ó Iron Man, nó go ndéanfaidh siad buille ar gach duine sna margaí airgeadais.
Ach obair Dáta Tá an t-eolaí tiomáinte ag sonraí, agus tá próiseáil na sonraí ar cheann de na gnéithe is tábhachtaí agus is mó a thógann am, sula gcuirtear i líonra néarúil iad nó sula ndéantar anailís orthu ar bhealach áirithe.

San Airteagal seo, déanfaidh ár bhfoireann cur síos ar conas is féidir leat sonraí a phróiseáil go tapa agus go héasca le treoracha agus cód céim ar chéim. Rinneamar iarracht an cód a dhéanamh solúbtha go leor agus d'fhéadfaí é a úsáid le haghaidh tacair shonraí éagsúla.

B’fhéidir nach bhfaighidh go leor gairmithe aon rud neamhghnách san alt seo, ach beidh tosaitheoirí in ann rud éigin nua a fhoghlaim, agus is féidir le haon duine a shamhlaigh le fada leabhar nótaí ar leith a dhéanamh le haghaidh sonraí a phróiseáil go tapa agus go struchtúrtha an cód a chóipeáil agus é a fhormáid dóibh féin, nó Íoslódáil an leabhar nótaí críochnaithe ó Github.

Fuaireamar an tacar sonraí. Cad atá le déanamh ina dhiaidh sin?

Mar sin, an caighdeán: ní mór dúinn a thuiscint cad a bhfuil muid ag déileáil leis, an pictiúr iomlán. Chun seo a dhéanamh, úsáidimid pandas chun cineálacha éagsúla sonraí a shainiú go simplí.

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

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

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

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

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

Breathnaímid ar na luachanna colúin:

  1. An ionann líon na línte i ngach colún agus líon iomlán na línte?
  2. Cad é croílár na sonraí i ngach colún?
  3. Cén colún ar mhaith linn díriú air chun tuar a dhéanamh dó?

Tabharfaidh freagraí na gceisteanna seo deis duit anailís a dhéanamh ar an tacar sonraí agus plean a tharraingt go garbh do na chéad ghníomhartha eile.

Chomh maith leis sin, le haghaidh breathnú níos doimhne ar na luachanna i ngach colún, is féidir linn úsáid a bhaint as an pandas cur síos () feidhm. Mar sin féin, is é an míbhuntáiste a bhaineann leis an bhfeidhm seo ná nach soláthraíonn sé faisnéis faoi cholúin le luachanna teaghrán. Déileálfaimid leo níos déanaí.

df.describe()

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

Amharcléiriú draíochta

Breathnaímid ar an áit nach bhfuil luachanna ar bith againn:

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

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

Bhí sé seo le breathnú gearr ó thuas, anois beidh muid ag bogadh ar aghaidh go dtí rudaí níos suimiúla

Déanaimis iarracht colúin nach bhfuil ach luach amháin acu i ngach sraitheanna a aimsiú agus, más féidir, a bhaint (ní bheidh tionchar acu ar an toradh ar aon bhealach):

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

Anois déanaimid muid féin a chosaint agus rath ár dtionscadal ó línte dúblacha (línte ina bhfuil an fhaisnéis chéanna san ord céanna le ceann de na línte atá ann cheana féin):

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

Roinnimid an tacar sonraí ina dhá: ceann acu le luachanna cáilíochtúla, agus an ceann eile le luachanna cainníochtúla

Anseo ní mór dúinn soiléiriú beag a dhéanamh: mura bhfuil na línte le sonraí atá ar iarraidh i sonraí cáilíochtúla agus cainníochtúla an-chomhghaolmhara lena chéile, ansin beidh orainn cinneadh a dhéanamh ar an méid a dhéanaimid a íobairt - na línte go léir le sonraí atá in easnamh, ach cuid díobh, nó colúin áirithe. Má tá na línte comhghaolaithe, tá gach ceart againn an tacar sonraí a roinnt ina dhá cheann. Seachas sin, beidh ort ar dtús déileáil leis na línte nach bhfuil comhghaol idir na sonraí atá in easnamh go cáilíochtúil agus go cainníochtúil, agus gan ach ansin an tacar sonraí a roinnt ina dhá cheann.

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

Déanaimid é seo chun é a dhéanamh níos éasca dúinn an dá chineál sonraí éagsúla seo a phróiseáil - ina dhiaidh sin tuigfimid cé chomh héasca is atá sé seo dár saol.

Oibrímid le sonraí cainníochtúla

Is é an chéad rud ba chóir dúinn a dhéanamh a chinneadh an bhfuil “colúin spiaireachta” sna sonraí cainníochtúla. Glaoimid ar na colúin seo toisc go gcuireann siad iad féin i láthair mar shonraí cainníochtúla, ach go bhfeidhmíonn siad mar shonraí cáilíochtúla.

Conas is féidir linn iad a aithint? Ar ndóigh, braitheann sé go léir ar nádúr na sonraí a bhfuil tú ag anailísiú, ach go ginearálta is beag sonraí uathúla a bhíonn ag colúin den sórt sin (thart ar 3-10 luach uathúla).

print(df_numerical.nunique())

Nuair a bheidh na colúin spiaireachta sainaitheanta againn, bogfaimid iad ó shonraí cainníochtúla go sonraí cáilíochtúla:

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

Ar deireadh, tá sonraí cainníochtúla deighilte go hiomlán againn ó shonraí cáilíochtúla agus anois is féidir linn oibriú leis i gceart. Is é an chéad rud a thuiscint i gcás ina bhfuil luachanna folamh againn (NaN, agus i gcásanna áirithe glacfar le 0 mar luachanna folamh).

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

Ag an bpointe seo, tá sé tábhachtach a thuiscint cad iad na colúin a bhféadfadh nialais na luachanna atá in easnamh a léiriú: an é seo mar gheall ar an gcaoi ar bailíodh na sonraí? Nó an bhféadfadh sé a bheith bainteach leis na luachanna sonraí? Ní mór na ceisteanna seo a fhreagairt ar bhonn cás ar chás.

Mar sin, má chinnimid fós go mb’fhéidir go bhfuil sonraí in easnamh orainn nuair atá nialais ann, ba cheart dúinn NaN a chur in ionad na nialais chun é a dhéanamh níos éasca oibriú leis na sonraí caillte seo níos déanaí:

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

Anois féachaimis cá bhfuil sonraí in easnamh orainn:

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

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

Anseo ba cheart na luachanna sin taobh istigh de na colúin atá in easnamh a mharcáil i buí. Agus anois tosaíonn an spraoi - conas déileáil leis na luachanna seo? Ar cheart dom sraitheanna leis na luachanna nó na colúin seo a scriosadh? Nó na luachanna folamh seo a líonadh le roinnt cinn eile?

Seo neasléaráid a chabhróidh leat cinneadh a dhéanamh ar cad is féidir, i bprionsabal, a dhéanamh le luachanna folamh:

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

0. Bain colúin neamhriachtanach

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

1. An bhfuil líon na luachanna folamh sa cholún seo níos mó ná 50%?

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

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

2. Scrios línte le luachanna folamh

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

3.1. Luach randamach á chur isteach

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

3.2. Luach tairiseach a chur isteach

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. Cuir isteach an meánluach nó an luach is minicí

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. Cuir isteach an luach arna ríomh ag samhail eile

Uaireanta is féidir luachanna a ríomh ag baint úsáide as samhlacha aischéimniúcháin ag baint úsáide as samhlacha ón leabharlann sklearn nó leabharlanna eile dá samhail. Beidh ár bhfoireann a chaitheamh alt ar leith ar conas is féidir é seo a dhéanamh go luath amach anseo.

Mar sin, faoi láthair, cuirfear isteach ar an scéal faoi shonraí cainníochtúla, toisc go bhfuil go leor nuances eile ann maidir le conas sonraí a ullmhú agus a réamhphróiseáil a dhéanamh níos fearr le haghaidh tascanna éagsúla, agus tá na bunghnéithe maidir le sonraí cainníochtúla curtha san áireamh san Airteagal seo, agus anois an t-am le filleadh ar shonraí cáilíochtúla, rud a scaramar roinnt céimeanna siar ó na cinn cainníochtúla. Is féidir leat an leabhar nótaí seo a athrú mar is toil leat, é a oiriúnú do thascanna éagsúla, ionas go dtéann réamhphróiseáil sonraí go han-tapa!

Sonraí cáilíochtúla

Go bunúsach, le haghaidh sonraí cáilíochtúla, úsáidtear an modh ionchódaithe One-te chun é a fhormáidiú ó theaghrán (nó réad) go huimhir. Sula mbogaimid ar aghaidh go dtí an pointe seo, bainimis úsáid as an léaráid agus an cód thuas chun déileáil le luachanna folamh.

df_categorical.nunique()

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

Bileog cheat Notepad le haghaidh réamhphróiseáil tapa Sonraí

0. Bain colúin neamhriachtanach

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

1. An bhfuil líon na luachanna folamh sa cholún seo níos mó ná 50%?

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

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

2. Scrios línte le luachanna folamh

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

3.1. Luach randamach á chur isteach

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

3.2. Luach tairiseach a chur isteach

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)

Mar sin, tá láimhseáil againn faoi dheireadh ar neamhnithe i sonraí cáilíochtúla. Anois tá sé in am ionchódú aon-te a dhéanamh ar na luachanna atá i do bhunachar sonraí. Is minic a úsáidtear an modh seo chun a chinntiú gur féidir le do algartam foghlaim ó shonraí ardcháilíochta.

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))

Mar sin, tá próiseáil déanta againn faoi dheireadh ar shonraí cáilíochtúla agus cainníochtúla ar leithligh - tá sé in am againn iad a chomhcheangal ar ais

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

Tar éis dúinn na tacair sonraí a chomhcheangal i gceann amháin, is féidir linn claochlú sonraí a úsáid ar deireadh ag baint úsáide as MinMaxScaler ón leabharlann sklearn. Déanfaidh sé seo ár luachanna idir 0 agus 1, rud a chabhróidh nuair a bheidh an tsamhail á oiliúint sa todhchaí.

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

Tá na sonraí seo réidh le haghaidh rud ar bith anois - líonraí neural, halgartaim ML caighdeánach, etc.!

San Airteagal seo, níor chuir muid san áireamh oibriú le sonraí sraith ama, ós rud é le haghaidh sonraí den sórt sin ba chóir duit teicnící próiseála beagán difriúil a úsáid, ag brath ar do thasc. Sa todhchaí, déanfaidh ár bhfoireann alt ar leith a chaitheamh ar an ábhar seo, agus tá súil againn go mbeidh sé in ann rud éigin suimiúil, nua agus úsáideach a thabhairt isteach i do shaol, díreach mar an gceann seo.

Foinse: will.com

Add a comment