Ma'lumotni o'rganish uchun Python yordamida ma'lumotlarni tozalash - eng yaxshi amaliyotlar va foydali to'plamlar

Kirish

Tozalash ma'lumotlari - bu tahlil bilan shug'ullanish kerak bo'lgan narsa. Bu juda katta ish emas, lekin siz ulkan ishlarni amalga oshirishingiz uchun shunday qilish kerak.

Men ma'lumotlarni tozalashga yordam berish uchun yozish va yozish uchun juda ko'p vaqt sarfladim, shu sababli yo'l davomida o'rgangan narsalarim bilan bo'lishmoqchiman. Agar siz ushbu lavozimni bosib o'tmagan bo'lsangiz, ma'lumotlarga oid loyihalarni qanday qilib yaxshiroq tashkillashtirish haqida uni tekshiring, chunki bu men quyida ko'rib chiqadigan ba'zi tushunchalarni shakllantirishga yordam beradi.

Kodimni yaxshiroq tartibga solishni boshlaganimdan so'ng, men "tozalash" kodini saqlaydigan maxsus paketni saqlashni boshladim. Agar biron bir narsa bo'lsa, bu menga avvalgi skriptlarimga mutlaqo mos kelmaydigan ma'lumotlarga maxsus usullarni yozish uchun asos yaratadi. Men ushbu regex elektron pochta ekstraktorini 100 marta yozishim shart emas, chunki men uni kirish joyida saqladim.

Ba'zi kompaniyalarda tozalash kodiga bag'ishlangan butun jamoalar mavjud, ammo ko'pchilik buni qilmaydi. Shunday qilib, ba'zi eng yaxshi amaliyotlarni tushunish yaxshidir. Biror narsa bo'lsa, nima uchun yoki nima uchun bunday bo'lmaganligini yaxshiroq tushuntirish uchun ma'lumotlarning tuzilishini yaxshiroq bilib olasiz.

Bundan tashqari, ushbu postga tayyorgarlik ko'rish jarayonida kjam tomonidan ushbu repo orqali yugurdim, bu men ma'lumotlarni tozalashni birinchi marta o'rganayotganimda juda foydali bo'lgan edi. Agar siz kodlarni tozalashga chuqurroq kirishni istasangiz, men sizdan shu erda boshlashingizni maslahat beraman.

Sizning maqsadingiz narsalarni tozalashdir ... yoki hech bo'lmaganda harakat qiling

Ma'lumotlaringizni tezda tekshiring ...

Yangi ma'lumotlar to'plamini olishda birinchi navbatda .head () usuli yordamida tarkibni tezda tekshirish.

pandalarni pd sifatida import qilish
df = pd.read_csv ('path_to_data')
df (10)
>>
... bu erda bir oz chiqish ...

Endi ustunlarning nomlari va turlarini tezda ko'rib chiqaylik. Ko'pincha siz kutganingiz kabi to'liq bo'lmagan ma'lumotni olasiz, masalan sana va boshqa g'alati narsalar. Oldindan tekshirish uchun.

# Ustun nomlarini oling
ustun_name = df.columns
bosib chiqarish (ustun_ nomlari)
# Ustun ma'lumotlarini oling
df.dtypes
# Shuningdek, ustun noyobligini tekshiring
ustun_nameslaridagi i uchun:
  bosib chiqarish ('{} noyob: {}'. format (i, df [i] .is_unique))

Keling, ma'lumotlar panelida df-ga .index-ni chaqirib, indeks bilan bog'liqligini ko'raylik. Agar indeks mavjud bo'lmasa, siz AttributeError olasiz: 'funktsiya' ob'ektida 'indeks' atributida xato mavjud emas.

# Indeks qiymatlarini tekshiring
df.index.values
# Muayyan indeks mavjudligini tekshiring
df.index.values-da "foo"
# Agar indeks mavjud bo'lmasa
df.set_index ('ustun_name_to_use', ichki = To'g'ri)

Yaxshi. Bizning ma'lumotlarimiz tezda tekshirildi, biz ma'lumotlar turlarini bilamiz, agar ustunlar noyob bo'lsa va biz keyinroq qo'shilishimiz va qo'shilishimiz mumkin bo'lgan indeks mavjudligini bilamiz. Qaysi ustunlarni saqlash yoki olib tashlashni aniqlaylik. Ushbu misolda biz 1, 3 va 5 indekslaridagi ustunlardan xalos bo'lishni istaymiz, shuning uchun men shunchaki ustun qiymatlarini tushirish uchun ishlatiladigan ro'yxatga qiymat qiymatlarini qo'shdim.

# Yo'qotishni istagan ustunlar haqida ro'yxat tushunchasini yarating
ustunlar_to_drop = [ustunlar nomlari [i] i uchun [1, 3, 5]]
# Keraksiz ustunlarni tashlang
df.drop (ustunlar_to_drop, ichki = To'g'ri, o'q = 1)

Inside = True qo'shildi, shuning uchun .fr () ni df-ga belgilab asl df-ni saqlashingiz shart emas. Pandalardagi ko'plab usullar ichki qo'llab-quvvatlaydi = To'g'ri, shuning uchun keraksiz qayta tayinlashni oldini olish uchun uni iloji boricha ko'proq ishlatishga harakat qiling.

NaN bilan nima qilish kerak

Agar siz xatolar yoki bo'sh joylarni to'ldirishingiz kerak bo'lsa, fillna () va dropna () usullaridan foydalaning. Bu juda tez tuyuladi, ammo barcha ma'lumotlarning manipulyatsiyalari hujjatlashtirilishi kerak, shunda siz ularni keyinroq kimgadir tushuntirishingiz mumkin.

NaNlarni satrlar bilan to'ldirishingiz mumkin yoki agar ular raqam bo'lsa, siz o'rtacha yoki o'rtacha qiymatdan foydalanishingiz mumkin. Yo'qolgan yoki noto'g'ri ma'lumotlar bilan nima qilish to'g'risida ko'plab munozaralar mavjud va to'g'ri javob bu ... bog'liqdir.

Siz nima uchun ma'lumotlarni olib tashlash yoki to'ldirish eng yaxshi usul ekanligi haqida ishlayotgan odamlaringizning mulohazalari va fikrlaridan foydalanishingiz kerak bo'ladi.

# NaN ni '' bilan to'ldiring
df ['col'] = df ['col']. filna ('')
# NaN ni 99 ga to'ldiring
df ['col'] = df ['col']. filna (99)
# NaN ni ustunning o'rtasiga to'ldiring
df ['col'] = df ['col']. fillna (df ['col']. o'rtacha ())

Bundan tashqari, siz nol bo'lmagan qiymatlarni usul argumenti sifatida = 'pad' qo'yib oldinga yoki orqaga yoyishingiz mumkin. Bu ma'lumotlar oynasidagi keyingi qiymatni oldingi NaN bo'lmagan qiymat bilan to'ldiradi. Ehtimol siz faqat bitta qiymatni to'ldirishni xohlaysiz (limit = 1) yoki siz barcha qiymatlarni to'ldirishni xohlaysiz. Qanday bo'lmasin, u sizning qolgan ma'lumotlaringizni tozalashga mos kelishiga ishonch hosil qiling.

df = pd.DataFrame (ma'lumotlar = {'col1': [np.nan, np.nan, 2,3,4, np.nan, np.nan]})
    kol1
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0 # Bu oldinga to'ldirish qiymati
5 NaN
6 NaN
df.fillna (usul = 'pad', chegara = 1)
    kol1
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
5 4.0 # Oldinga to'ldirilgan
6 NaN

Faqat 5-indeks qanday to'ldirilganiga e'tibor bering? Agar men cheklangan plaginni to'ldirmagan bo'lsam, u butun ma'lumotlar oynasini to'ldirgan bo'lar edi. Biz oldinga to'ldirish bilan cheklanmaymiz, balki bfill bilan qayta to'ldiramiz.

# Birinchi ikkita NaN qiymatini birinchi mavjud qiymat bilan to'ldiring
df.fillna (usul = 'bfill')
    kol1
0 2.0 # to'ldirildi
1 2.0 # to'ldirildi
2 2.0
3 3.0
4 4.0
5 NaN
6 NaN

Siz ularni faqat ma'lumotlar qatoridan yoki satrdan yoki ustundan chiqarib tashlashingiz mumkin.

# Hech qanday nansi bo'lmagan satrlarni tashlang
df.dropna ()
# Har qanday nansga ega bo'lgan ustunlarni tashlang
df.dropna (o'qi = 1)
# Kamida 90% NaN bo'lmagan ustunlarigina tashla
df.dropna (thr = int (df.shape [0] * .9), eksa = 1)

Thesh = N parametrlari ustunning omon qolish uchun kamida NNN ga ega emasligini talab qiladi. Buni o'zingizning ustunlaringizda ma'qul deb topadigan yo'qolgan ma'lumotlarning pastki chegarasi deb o'ylang. Ba'zi xususiyatlar to'plamini o'tkazib yuborishi mumkin bo'lgan ba'zi ma'lumotlarni hisobga oling. Mavjud xususiyatlarning 90 foiziga ega yozuvlarni o'zingizning modelingizga nomzod sifatida ko'rib chiqishdan oldin ularni xohlaysiz.

np.bu erda (if_this_is_true, do_this, else_do_that)

Buni oldin tahliliy faoliyatimda ishlatmaslikda aybdorman, chunki bu foydali emas. Bu ma'lumotlar oynasida birlashganda juda ko'p vaqt va umidsizlikni tejaydi. Agar siz tezda biron bir asosiy tozalashni yoki muhandislik xususiyatlarini tezda bajarishni istasangiz, bu erda buni qanday amalga oshirishingiz mumkin.

Agar siz ustunni baholayotgan bo'lsangiz, unda siz qiymatlar 10 dan katta ekanligini bilishni xohlaysizmi, agar ular natijani "foo" bo'lishini istasangiz va natijani "bar" shaklida ko'rishni xohlamasangiz.

# Ushbu sintaksisga amal qiling
np.bu erda (if_this_ sharti_is_true, do_this, else_this)
# Misol
df ['new_column'] = np.sp (df [i]> 10, 'foo', 'bar)

Quyidagi kabi murakkab operatsiyalarni bajarishingiz mumkin. Bu erda biz ustun yozuvi foo bilan boshlanib, bar bilan tugamasligini tekshiramiz. Agar bu belgilansa, biz Trueni qaytaramiz, aks holda biz ustundagi joriy qiymatni qaytaramiz.

df ['new_column'] = np. erda (df ['col']. str.startswith ('foo') va
                            emas df ['col'] str.endswith ('bar'),
                            Rost
                            df ['col'])

Va undan ham samaraliroq, siz np. ҷои joylaringizni o'rnatishni boshlashingiz mumkin, shunda ular bir-biriga yopishadi. Uchinchi operatsiyalarni qanday qilib qirib tashlaganingizga o'xshab, ularni o'qib bo'lmasligiga ishonch hosil qiling, chunki siz juda qattiq joylashtirilgan bayonotlar bilan tezda chalkashib ketishingiz mumkin.

# Np.play bilan uchta darajali uyalar
np. joyda (if_this_condition_is_true_one, do_this,
  np.bu erda (if_this_konditsiyasi_is_true_to'rt, do_shu,
    np.bu erda (if_this_condition_is_true_three, do_foo, do_bar)))
# Arzimas misol
df ['foo'] = np. erda (df ['bar'] == 0, 'Nol',
              np.joy (df ['bar'] == 1, 'bitta',
                np.joy (df ['bar'] == 2, 'Ikki', 'Uch'))))

O'zingizdagi narsani tasdiqlang va sinab ko'ring

Https://www.programiz.com saytiga kredit

Ma'lumotlaringizni yaxshi ma'lumotlar jadvalida saqlaganingiz uchun, dublikatlar yo'q, etishmayotgan qiymatlar yo'qligi sababli, siz hali ham asosiy ma'lumotlar bilan bog'liq muammolarga duch kelishingiz mumkin. Va 10M + qator yoki yangi API ma'lumotlar ro'yxati bilan, qiymatlar siz kutgan narsaga to'liq mos kelishiga qanday ishonch hosil qilishingiz mumkin?

Haqiqat shundaki, siz sinab ko'rmaguningizcha ma'lumotlaringiz to'g'riligini hech qachon bilmaysiz. Dasturiy ta'minot muhandisligining eng yaxshi amaliyotlari ularning ishini sinashga ko'proq tayanadi, ammo ma'lumotlar ilmi uchun bu hanuzgacha davom etmoqda. Keyinchalik o'zingizni qayta tayyorlashdan ko'ra, hoziroq boshlash va o'zingizga yaxshi ish printsiplarini o'rgatish yaxshiroqdir.

Sinab ko'rish uchun oddiy ma'lumotlar qatorini yarataylik.

df = pd.DataFrame (ma'lumotlar = {'col1': np.random.randint (0, 10, 10), 'col2': np.random.randint (-10, 10, 10)})
>>
   col1 col2
0 0 6
1 6 -1
2 8 4
3 0 5
4 3 -7
5 4 -5
6 3 -10
7 9 -8
8 0 4
9 7 -4

Col1-dagi barcha qiymatlar pitondagi standart kutubxona bilan ta'minlangan o'rnatilgan tasdiqdan foydalanib,> = 0 ekanligini tekshirib ko'raylik. Siz python-dan so'rayapsizmi, agar rost bo'lsa "df ['col1'] dagi barcha narsalar noldan katta. Agar bu to'g'ri bo'lsa, xato qilmasangiz, yo'lingizda davom eting.

tasdiqlash (df ['col1']> = 0) .all () # Hech narsa qaytarilmasligi kerak

Ajoyib ishlaganga o'xshaydi. Ammo .all () tasdiqga qo'shilmagan bo'lsa nima bo'ladi?

tasdiqlash (df ['col1']> = 0)
>>
ValueError: Seriyalarning haqiqat qiymati noaniq. A.empty, a.bool (), a.item (), a.any () yoki a.all () dan foydalaning.

Humm, biz o'z shaxsiy ma'lumotlarimiz nomlarini sinab ko'rish paytida ba'zi imkoniyatlarga ega bo'lganga o'xshaydi. Sinab ko'raylik - har qanday qiymat satrdir.

assert (df ['col1']! = str) .any () # Hech narsa qaytarilmasligi kerak

Ikkala ustunning tengligini tekshirish uchun nima qilish kerak?

tasdiqlash (df ['col1'] == df ['col2']). hammasi ()
>>
Traceback (eng so'nggi qo'ng'iroq oxirgi):
  Fayl "", 1-qator,  da
Tasdiqlash xatosi

A, bizning tasdiqimiz muvaffaqiyatsiz tugadi!

Ma'lumotlaringiz ichida hech qachon bo'lmasligi kerak bo'lgan sharoitlarni sinab ko'rish uchun eng yaxshi tajribadan foydalanish kerak. Shunday qilib, agar siz kodni ishlatsangiz, agar bunday tasdiqlardan biri bajarilmasa, hamma narsa to'xtaydi.

.All () usuli ob'ektlardagi barcha elementlar tasdiqdan o'tganligini, .any () esa ob'ektlardagi biron bir element tasdiqlash testidan o'tganligini tekshiradi.

Bu siz xohlaganingizda foydali bo'lishi mumkin:

  • Ma'lumotlarga biron bir salbiy qiymat kiritilganligini tekshiring;
  • Ikkala ustun bir xil ekanligiga ishonch hosil qiling;
  • O'zgarish natijalarini aniqlang, yoki;
  • Noyob ID raqami to'g'ri yoki yo'qligini tekshiring.

Ko'proq tasdiqlash usullari mavjud, ammo men ular haqida to'xtamayman, ammo bu erda ishlatishingiz mumkin bo'lgan narsalar bilan tanishing. Siz qachondir ma'lum bir shartni sinab ko'rishingiz kerakligini hech qachon bilmaysiz va shu bilan birga kodingizda xohlamagan sharoitlar uchun sinovni boshlashingiz kerak.

Hamma narsani sinab ko'rmang, balki sizning modellaringizni buzadigan narsalarni sinab ko'ring.

Masalan Barcha 0 va 1s bo'lishi kerak bo'lgan xususiyat aslida ushbu qiymatlar bilan to'lgan.

Bundan tashqari, bu ajablanarli to'plam pandalar ham sinov paketini o'z ichiga oladi.

pandas.util.testing tm sifatida import qilish
tm.assert_series_equal (df ['col1'], df ['col2'])
>>
Tasdiqlash xatosi: Seriyalar boshqacha
Seriya qiymatlari har xil (100.0%)
[chapda): [0, 6, 8, 0, 3, 4, 3, 9, 0, 7]
[o'ngda]: [6, -1, 4, 5, -7, -5, -10, -8, 4, -4]

Biz nafaqat xato tashladik, balki pandalar ham noto'g'ri bo'lgan narsalarni aytib berishdi.

Yaxshi.

Bundan tashqari, agar siz o'zingiz uchun sinov to'plamini qurishni boshlamoqchi bo'lsangiz - va buni amalga oshirish haqida o'ylashni xohlasangiz - Python kutubxonasida o'rnatilgan eng arzon to'plam bilan tanishing. Bu haqda ko'proq ma'lumotni bu erda olishingiz mumkin.

obodonlashtiruvchi

O'zingizning registringizni yozishning o'rniga - eng yaxshi payt og'riqdir, ba'zida bu siz uchun qilingan. Go'zallashtiruvchi to'plam sizga elektron pochta yoki URL manzillari uchun tez-tez ishlatiladigan naqshlarni tozalashga yordam beradi. Bu hayratlanarli narsa emas, lekin tezda tozalashga yordam beradi.

$ pip3 obodonlashtirish moslamasini o'rnatish
go'zallashtiruvchidan import Email, Url
email_string = 'foo@bar.com'
email = Email (email_string)
bosib chiqarish (email.domain)
bosib chiqarish (elektron pochta manzili)
chop etish (email.is_free_email)
>>
bar.com
foo
Yolg'on
url_string = 'https://github.com/labtocat/beautifier/blob/master/beautifier/__init__.py'
url = Url (url_string)
bosib chiqarish (url.param)
bosib chiqarish (url.username)
bosib chiqarish (url.domain)
>>
Yo'q
{'msg': 'hozirda funksiya faqat bog'langan URL manzillari bilan mavjud'}
github.com

Agar men ishlashim kerak bo'lgan URL manzillari bo'lsa, ushbu paketdan foydalanaman va manzilning ma'lum qismlarini olish uchun 100 marta regex yozishni xohlamayman.

Unicode bilan ishlash

Ba'zi bir NLP bilan shug'ullanayotganda, Unicode bilan shug'ullanish eng yaxshi paytlarda asabiylashishi mumkin. Men spaCy-da biron bir narsani ishlataveraman va birdan hujjat tanasida biron bir kod paydo bo'lganligi sababli hamma narsa buziladi.

Bu, albatta, eng yomoni.

Ftfy-dan foydalanib, siz haqiqatan ham buzilgan Unicode-ni o'rnatishingiz mumkin. Kimdir Unicode-ni bitta standart bilan kodlaganini va uni boshqasi bilan hal qilganini ko'rib chiqing. Endi siz "mojibake" deb ataladigan mantiqsiz ketma-ketliklar qatori orasida bu bilan shug'ullanishingiz kerak.

# Mojibake misoli
& macr; \\ _ (ã \ x83 \ x84) _ / & makr;
\ ufeffartParty
\ 001 \ 033 [36; 44mI & # x92; m

Yaxshiyamki, ftfy mojibake-ni aniqlash va bekor qilish uchun evristikadan foydalanadi, juda past darajada yolg'on ijobiy. Keling, yuqoridagi satrlarimizni nimaga o'zgartirishi mumkinligini ko'rib chiqamiz. Asosiy usul fix_text () dir va siz kodni ochishda foydalanasiz.

import ftfy
foo = '& macr; \\ _ (ã \ x83 \ x84) _ / & macr;'
bar = '\ ufeffartParty'
baz = '\ 001 \ 033 [36; 44mI & # x92; m'
bosib chiqarish (ftfy.fix_text (foo))
bosib chiqarish (ftfy.fix_text (bar))
bosib chiqarish (ftfy.fix_text (baz))

Agar siz dekodlash qanday amalga oshirilayotganini ko'rmoqchi bo'lsangiz, ftfy.explain_unicode () -ni sinab ko'ring. Menimcha, bu haddan tashqari foydali bo'lmaydi, ammo jarayonni ko'rish juda qiziq.

ftfy.explain_unicode (foo)
U + 0026 va [Po] AMPERSAND
U + 006D m [Ll] LATIN KICHIK XAT M
U + 0061 a [Ll] LATIN KICHIK XAT A
U + 0063 c [Ll] LATIN Kichik Kichik X
U + 0072 r [Ll] LATIN Kichik KATTA R
U + 003B; [Po] SEMICOLON
U + 005C \ [Po] SOLIDUSNI YO'Q
U + 005F _ [Don] KO'Z TIZIM
U + 0028 ([Ps] Chapdagi ota-onalar
U + 00E3 ã [Ll] LATIN Kichik Kichik Xatda TILDE BILAN
U + 0083 \ x83 [Cc] 
U + 0084 \ x84 [Cc] 
U + 0029) [Pe] O'ng tomondagi ota-onalar
U + 005F _ [Don] KO'Z TIZIM
U + 002F / [Po] SOLIDUS
U + 0026 va [Po] AMPERSAND
U + 006D m [Ll] LATIN KICHIK XAT M
U + 0061 a [Ll] LATIN KICHIK XAT A
U + 0063 c [Ll] LATIN Kichik Kichik X
U + 0072 r [Ll] LATIN Kichik KATTA R
U + 003B; [Po] SEMICOLON
Yo'q

Dedupe

Bu tuzilgan ma'lumotlarda nusxalashni va ob'ektni echishni tezda amalga oshirish uchun mashina o'qitishdan foydalanadigan kutubxona. Bu erda juda katta post bor, u men xohlaganimdan ham ko'proq tafsilotlarni ichiga oladi va men unga ko'proq e'tibor qaratdim.

Biz Chikagoda erta bolalikni aniqlash haqidagi ma'lumotni yuklab olishni boshlaymiz, bu erda. Unda bir nechta yo'qolgan qiymatlar va turli xil ma'lumot manbalarida takrorlanadigan qiymatlar mavjud, shuning uchun ularni o'rganish yaxshi bo'ladi.

Agar siz ilgari takroriy ma'lumotlarni ko'rgan bo'lsangiz, bu juda tanish ko'rinadi.

# Ustunlar va har birida etishmayotgan qiymatlar soni
Id 0 na qiymatiga ega
Manba 0 na qiymatiga ega
Sayt nomi 0 ga teng qiymatga ega
Manzil 0 ga teng
Zip 1333 na qiymatga ega
Telefon 146 qiymatga ega
Faks 3299 na qiymatga ega
Dastur nomi 2009 yil qiymatiga ega
Kun davomiyligi 2009 yil qiymatiga ega
IDHS Provider ID 3298 na qiymatga ega
Agentlik 3325 qiymatga ega
Mahalla 2754 na qiymatga ega
Moliyalashtirilgan ro'yxatdan o'tish 2424 qiymatga ega
Dastur optsiyasi 2800 qiymatga ega
EHS saytlar soni 3319 ga teng
Har bir HS sayt uchun raqam 3319 qiymatga ega
Direktor 3337 qiymatga ega
Head Start Fund 3337 qiymatga ega
Eearly Head Start fondi 2881 qiymatga ega
CC fondida 2818 na qiymat mavjud
Progmod 2818 na qiymatga ega
Veb-sayt 2815 qiymatga ega
Ijrochi direktor 3114 qiymatga ega
Markaz direktori 2874 qiymatga ega
ECE Mavjud dasturlari 2379 qiymatga ega
NAEYC Valid qadar 2968 na qiymatga ega
NAEYC dastur identifikatori 3337 na qiymatga ega
Elektron pochta manzili 3203 qiymatiga ega
Profilaktika untsiyasining qiymati 3185 ga teng
Binafsharang bog'lovchi xizmat turi 3215 na qiymatga ega
Ustun 3337 na qiymatga ega
2-ustunda 3018 na qiymat mavjud

Dedupe tomonidan taqdim etilgan PreProcess usuli namuna olish va o'qitish bosqichlarida xatolarga yo'l qo'ymaslik uchun zarur. Menga ishoning, shundan foydalanish dedupe-dan foydalanishni ancha osonlashtiradi. Ushbu usulni mahalliy "tozalash to'plamida" saqlang, shunda kelajakda takrorlanadigan ma'lumot bilan ishlashda foydalanishingiz mumkin.

pandalarni pd sifatida import qilish
import numby
import dedupe
import os
import csv
import re
unidecode import unidecode-dan
def preProcess (ustun):
    '' '
    Ajratish jarayonida xatolarni oldini olish uchun ishlatiladi.
    '' '
    urinib ko'ring:
        ustun = ustun.decode ('utf8')
    tashqari, AttributeError:
        o'tish
    ustun = nomodekod (ustun)
    ustun = re.sub ('+', '', ustun)
    ustun = re.sub ('\ n', '', ustun)
    ustun = ustun.strip (). chiziq ('' '). (pastki chiziq ().
    
    agar ustun bo'lmasa:
        ustun = Yo'q
    qaytish ustuni

Endi ma'lumotlarni qayta ishlash paytida ustunlar yordamida .csv ustunini import qilishni boshlang.

def readData (fayl nomi):
    
    data_d = {}
    f bilan ochiq (fayl nomi) f sifatida:
        o'quvchi = csv.DictReader (f)
        o'quvchi qatori uchun:
            clean_row = ((k, preProcess (v)) uchun (k, v) qatorda.items ()]
            row_id = int (qator ['Id'])
            data_d [row_id] = dik (toza_ro)
qaytish df
name_of_file = 'data.csv'
chop etish ('Ma'lumotlarni tozalash va import qilish ...')
df = o'qishData (ism_of_fayl)

Endi biz takroriy qiymatlarni aniqlash uchun qanday funktsiyalarga qarashimiz kerakligini aytib berishimiz kerak. Quyida, har bir xususiyat maydon bilan belgilanadi va ma'lumotlar turiga tayinlanadi va agar u etishmayotgan qiymatlarga ega bo'lsa. Siz bu erda ishlatishingiz mumkin bo'lgan turli xil o'zgaruvchilar turlarining to'liq ro'yxati mavjud, ammo biz ularni oson ushlab turish uchun hozirgi paytda iplarni yopishtiramiz.

Takroriylikni aniqlash uchun men har bir ustundan foydalanmayman, lekin agar siz bu ma'lumotlarning nusxasini aniqlashni osonlashtirsa deb o'ylaysiz.

# Maydonlarni belgilang
maydonlar = [
        {'field': 'Source', 'type': 'Set'},
        {'field': 'Sayt nomi', 'type': 'String'},
        {'field': 'Manzil', 'type': 'String'},
        {'field': 'Zip', 'type': 'Aniq', 'yo'q': True},
        {'field': 'Phone', 'type': 'String', 'yo'q': True},
        {'field': 'Elektron pochta manzili', 'type': 'String', 'yo'q': True},
        ]

Keling, ba'zi ma'lumotlarni tarqatishni boshlang.

# Bizning modelimizga o'ting
deduper = dedupe.Dedupe (maydonlar)
# Ishlayotganini tekshiring
deduper
>>
 da
# Ba'zi ma'lumot namunalarini ... 15000 yozuvga kiriting
deduper.sample (df, 15000)

Endi biz etiketkalash qismiga o'tmoqdamiz. Quyida ushbu usulni ishlatsangiz, dedupe sizdan bir nechta oddiy yorliqlashni talab qiladi.

dedupe.consoleLabel (deduper)
Siz nimani ko'rishingiz kerak; deduperni qo'lda mashq qilish

Haqiqiy "a-ha!" Lahzasi, siz ushbu xabarni olganingizda. Bu deduper sizdan uni o'rgatishingizni so'raydi, shuning uchun nima izlash kerakligini biladi. Ikkilamchi qiymat qanday bo'lishi kerakligini bilasiz, shuning uchun bu ma'lumotni davom ettiring.

Ushbu yozuvlar xuddi shu narsani nazarda tutadimi?
(y) es / (n) o / (u) nsure / (f) tugadi

Endi takrorlash sodir bo'lganligini bilish uchun siz tonna va tonna yozuvlarni qidirishingiz shart emas. Buning o'rniga, neyron tarmoq siz ma'lumot kartasida nusxalarni topishga o'rgatilmoqda.

Agar siz unga biron bir yorliq qo'ygan bo'lsangiz, mashg'ulotni yakunlang va yutuqlaringizni saqlang. Keyinchalik, o'chirilishi kerak bo'lgan ma'lumotlar ro'yxati ob'ektlarini takrorlagan bo'lsangiz, siz keyinchalik o'zingizning neyron tarmog'ingizga qaytishingiz mumkin.

deduper.train ()
# Ta'limni tejash
ochiq (Training_file, 'w') tf sifatida:
        deduper.writeTrening (tf)
# Sozlamalarni saqlash
ochiq (settings_file, 'wb') sf sifatida:
        deduper.writeSozlamalar (sf)

Biz deyarli tayyor bo'ldik, chunki keyingi safar biz ma'lumotlar uchun chegarani belgilashimiz kerak. Eslatma_ vazni 1 ga teng bo'lsa, deduperga aytamizki, esga olishni aniqlik kabi qadrlaymiz. Ammo, agar return_weight = 3 bo'lsa, biz chaqirishni uch baravar ko'proq qadrlaymiz. Siz uchun mos keladigan narsani ko'rish uchun ushbu sozlamalar bilan o'ynashingiz mumkin.

pol = deduper.threshold (tf, еске olish vaqti = 1)

Va nihoyat, biz endi ma'lumotlar bazamiz orqali qidirishimiz va nusxalari qaerda ekanligini bilib olishimiz mumkin. Ushbu lavozimga kirishga ancha vaqt bo'ldi, ammo bu qo'lda bajarishdan ancha yaxshi.

# Dublikatlarni birgalikda to'plang
klasterli_dupes = deduper.match (ma'lumotlar_d, pol qiymat)
chop etish ('{} takroriy to'plamlar mavjud'.format (len (clustered_dupes))))

Shunday qilib, nusxalarimizni ko'rib chiqaylik.

klasterli_duplar
>>
[((0, 1, 215, 509, 510, 1225, 1226, 1879, 2758, 3255),
  qator ([0.88552043, 0.88552043, 0.77351897, 0.88552043, 0.88552043,
         0.88552043, 0.88552043, 0.89765924, 0.75684386, 0.83023088])),
 ((2, 3, 216, 511, 512, 1227, 1228, 2687), ...

Hum, bu bizga ko'p narsa aytmaydi. Aslida, bu nimani ko'rsatmoqda? Bizning barcha qadriyatlarimiz bilan nima bo'ldi?

Agar siz (0, 1, 215, 509, 510, 1225, 1226, 1879, 2758, 3255) qiymatlarga diqqat bilan qarasangiz, deduper nusxalarning barcha id joylari aslida bir xil qiymatga ega deb hisoblaydi. Buni tekshirish uchun biz asl ma'lumotlarga qarashimiz mumkin.

{'Id': '215',
 'Manba': 'cps_early_childhood_portal_scrape.csv',
 "Sayt nomi": "najot qo'shinining ma'badi",
 'Manzil': '1 n. ogden ',
...
{'Id': '509',
 'Manba': 'cps_early_childhood_portal_scrape.csv',
 "Sayt nomi": "najot armiyasi - ma'bad / najot armiyasi",
 "Manzil": "1-og'den ko'chasi",
 'Zip': Yo'q,
..

Bu menga nusxalar kabi ko'rinadi. Yaxshi.

Deduper-dan ko'proq rivojlangan usullar mavjud, masalan, klasterlar ketma-ketligi uchun matchBlocks yoki ikkita maydonning o'zaro ta'siri nafaqat qo'shibgina qolmay, balki ko'paytiruvchi ham. Buni allaqachon bajarish kerak edi, shuning uchun yuqoridagi maqola uchun bu izohni qoldiraman.

Fuzzywuzzy bilan taqqoslash

Ushbu kutubxonadan foydalaning. Bu haqiqatan ham qiziqarli, chunki u taqqoslanayotganda iplarning bir-biriga yaqinligini aniqlaydi.

Bu juda ajoyib vosita edi, chunki men ilgari Google Sheet-ning fuzzymatch addon-ga ishonishim kerak edi, chunki bu ma'lumotlarni tekshirish muammolarini aniqlashga imkon berdi - CRM qoidalari to'g'ri qo'llanilmasa yoki ishlamasa - va tozalash kerak edi. har qanday tahlil qilish uchun yozuvlar.

Ammo, katta ma'lumotlar to'plamlari uchun bu yondashuv bir tekisda bo'ladi.

Ammo, fuzzywuzzy bilan siz ko'proq ilmiy masalada satrlarni taqqoslashni boshlashingiz mumkin. Juda texnik bo'lmaslik uchun, lekin taqqoslashda Levenshtein masofasi deb nomlangan narsani ishlatadi. Bu ikkita ketma-ketlik uchun simli o'xshashlik o'lchovi, shunda orasidagi masofa bitta so'zni boshqa so'zga o'zgartirish uchun zarur bo'lgan bitta belgi tahriri sonidir.

Masalan Agar siz satrda foo satrini o'zgartirmoqchi bo'lsangiz, o'zgarishi kerak bo'lgan belgilar soni 3 ga teng bo'ladi va bu "masofani" aniqlash uchun ishlatiladi.

Bu amalda qanday ishlashini ko'rib chiqaylik.

$ pip3 fuzzywuzzy dasturini o'rnatadi
# test.py
fuzzywuzzy import fuzz-dan
fuzzywuzzy import jarayonidan
foo = 'bu satr'
bar = 'bu satrga o'xshaydimi?'
fuzz.ratio (foo, bar)
>>
71
fuzz.WRatio (foo, bar) # Og'irligi nisbati
>>
73
fuzz.UQRatio (foo, bar) # Unicode tez nisbati
>> 73

Fuzzywuzzy to'plamida satrlarni baholashning turli xil usullari mavjud (WRatio, UQRatio va boshqalar) va men ushbu maqola uchun standart bajarishga sodiq qolmoqchiman.

Keyingi, biz 0 va 100 o'rtasidagi ketma-ketliklarning o'xshashligini o'lchaydigan, lekin taqqoslashdan oldin tokenni sarhisob qiladigan tokenlangan satrni ko'rib chiqishimiz mumkin. Bu kalit, chunki siz satrlarning tarkibini emas, balki ularning tarkibini ko'rishni xohlashingiz mumkin.

Fo va bar satrlari bir xil tokenlarga ega, ammo struktura jihatidan farq qiladi. Siz ularga xuddi shunday munosabatda bo'lishni xohlaysizmi? Endi siz osongina o'zingizning ma'lumotlaringizdagi bunday farqni ko'rishingiz va hisobga olishingiz mumkin.

foo = 'bu foo'
bar = 'foo a bu'
fuzz.ratio (foo, bar)
>>
31
fuzz.token_sort_ratio ('bu foo', 'foo a is this')
>>
100 ga

Yoki keyingi, siz qiymatlar ro'yxatidan satrning eng yaqin mos kelishini topishingiz kerak. Bu holda biz Garri Potter sarlavhalarini ko'rib chiqamiz.

Bu Garri Potter kitobi haqida ... unda nimanidir sarlavhasi bor ... unda men yo'q. Men shunchaki taxmin qilishim va ushbu kitoblarning qaysi biri mening taxminimga eng yaqin ekanligini ko'rishim kerak.

Mening taxminim - bu "olov" va u mumkin bo'lgan sarlavhalar ro'yxatiga qanday ta'sir qilishini ko'raylik.

lst_to_eval = ['Garri Potter va Faylasufning Toshi',
"Garri Potter va sirlar palatasi",
"Garri Potter va Azkaban asiri",
"Garri Potter va olov ko'zoynagi",
"Garri Potter va Feniks ordeni",
"Garri Potter va yarim qonli shahzoda",
"Garri Potter va o'lim xodalari"]
# Mening taxminimga asoslanib ikkita eng yaxshi javob
process.extract ("olov", lst_to_eval, limit = 2)
>>
(("Garri Potter va olovli ko'zoynak", 60), ("Garri Potter va sehrgarning toshi", 30)
natijalar = process.extract ("olov", lst_to_eval, limit = 2)
natijada:
  chop etish ('{}: {{}' formati bor (natija [0], natija [1]))
>>
Garri Potter va olovli ko'zoynak: 60 ball
Garri Potter va Sehrgarning Toshi: 30 ball

Yoki agar siz shunchaki birini qaytarishni xohlasangiz, qila olasiz.

>>> process.extractOne ("tosh", lst_to_eval)
("Garri Potter va Sehrgarning Toshi", 90)

Bilaman, biz dedupeing haqida oldinroq gaplashdik, ammo fuzzywuzzy bilan xuddi shu jarayonning yana bir qo'llanmasi. Ikki nusxasini o'z ichiga olgan satrlar ro'yxatini olishimiz mumkin va nusxalarni aniqlash va olib tashlash uchun loyqa taalukli usullardan foydalanamiz.

Neyron tarmoqqa o'xshab emas, lekin u kichik operatsiyalar uchun ishni bajaradi.

Biz Garri Potter mavzusini davom ettiramiz va ro'yxatdagi kitoblardan nusxalarni qidiramiz.

Siz 0 va 100 oralig'ida chegarani belgilashingiz kerak. Agar chegara kamayib borsa, topilgan nusxalar soni ko'payadi, shuning uchun qaytarilgan ro'yxat qisqartiriladi. Odatiy - 70.

# Takroriy belgilar nomlari ro'yxati
o'z ichiga oladi_dupes = [
'Garri Potter',
'H. Kulol ',
"Garri Jeyms Potter",
"Jeyms Potter",
'Ronald Bilius \' Ron \ 'Uesli',
"Ron Uesli",
'Ronald Uesli']
# Takroriy qiymatlarni chop eting
process.dedupe (o'z ichiga oladi_duplar)
>>
dik_kitlar (['Garri Jeyms Potter', "Ronald Bilius 'Ron' Uesli"])
# Takroriy qiymatlarni yuqori chegara bilan bosib chiqaring
process.dedupe (o'z ichiga oladi_dup, chegara = 90)
>>
dik_kitlar (['Garri Jeyms Potter', 'X. Potter', 'Ronald Bilius' Ron 'Uesli'])

Tez bonus sifatida siz matnli satrdan sanalarni ajratib olish uchun datetime to'plamiga bir nechta noaniq moslashuvlarni amalga oshirishingiz mumkin. Agar regex iborasini yozishni (yana) xohlamasangiz, bu juda yaxshi.

dateutil.parser tahlil qilishdan
dt = tahlil qilish ("Bugun 2047 yil 1-yanvar, soat 8:21:00 da", loyqa = To'g'ri)
bosib chiqarish (dt)
>>
2047-01-01 08:21:00
dt = tahlil qilish ("nimadir 20 may 1849 yil", loyqa = To'g'ri)
bosib chiqarish (dt)
>>
2049-05-18 00:00:00

Bir oz sinab ko'ring

Ma'lumotni tozalash bilan bir qatorda, ma'lumotlarni o'zingizning namunangizga kiritishingiz mumkin bo'lgan shaklda tayyorlashingiz kerak bo'ladi. Bu erda keltirilgan ko'plab misollar to'g'ridan-to'g'ri hujjatlardan olinadi, ular tekshirilishi kerak, chunki har bir paketning yangi versiyasini tushuntirish yaxshi ishdir.

Avval biz qayta ishlov berish paketini import qilamiz, keyin u erda qo'shimcha usullarni olamiz. Shuningdek, men 0.20.0 versiyasidan foydalanmoqdaman, shuning uchun ba'zi paketlarni import qilishda muammolarga duch kelsangiz, sizning versiyangizni tekshiring.

Biz har xil qayta ishlash usullari qanday ishlashini ta'kidlash uchun str va int ikki xil ma'lumotlar bilan ishlaymiz.

# Loyiha boshlanganda
importni qayta ishlashdan
# Va ishlov berish uchun tasodifiy ints qatorini yarataylik
ary_int = np.random.randint (-100, 100, 10)
ary_int
>> [5, -41, -67, 23, -53, -57, -36, -25, 10, 17]
# Va ba'zi odamlar bilan ishlash uchun str
ary_str = ['foo', 'bar', 'baz', 'x', 'y', 'z']

Bizning ary_str-da LabelEncoder yordamida tezkor yorliqlashni sinab ko'raylik. Bu juda muhim, chunki siz faqat xom iplarni boqolmaysiz - yaxshi, ammo mumkin, ammo bu ushbu moddaning doirasiga kirmaydi. Shunday qilib, har bir satrda teglar bilan 0 dan n gacha bo'lgan qiymatlarni kodlaymiz. Ary_str da biz 6 ta noyob qiymatga egamiz, shuning uchun ularning oralig'i 0 - 5 bo'lishi kerak.

sklearn.preprocessing import LabelEncoder-dan
l_encoder = oldindan ishlov berish.LabelEncoder ()
l_encoder.fit (ary_str)
>> LabelEncoder ()
# Bizning qadriyatlarimiz qanday?
l_encoder.transform (['foo'])
>> qator ([2])
l_encoder.transform (['baz'])
>> qator ([1])
l_encoder.transform (['bar'])
>> qatori ([0])

Bularning buyurtma qilinmaganligini sezasiz, chunki qatorda bar oldin foo orqali kelgan bo'lsa, u 2 bilan kodlangan, bar esa 1 bilan kodlangan. Biz qiymatlarimiz kodlanganligiga ishonch hosil qilishimiz kerak bo'lganda boshqa kodlash usulidan foydalanamiz. to'g'ri tartibda

Agar sizda kuzatib borish uchun juda ko'p toifalar bo'lsa, qaysi str xaritalarni esdan chiqarishingiz mumkin. Buning uchun biz diktani yaratishimiz mumkin.

# Xaritalarni tekshirish
ro'yxat (l_encoder.classes_)
>> ['bar', 'baz', 'foo', 'x', 'y', 'z']
# Xaritalar lug'atini yaratish
dik (zip (l_encoder.classes_, l_encoder.transform (l_encoder.classes_))))
>> {'bar': 0, 'baz': 1, 'foo': 2, 'x': 3, 'y': 4, 'z': 5}

Agar ma'lumotlar ro'yxatiga ega bo'lsangiz, jarayon biroz farq qiladi, ammo aslida biroz osonroq. DataFrame-ga LabelEncoder ob'ektini .apply () ni kiritish kifoya. Har bir ustun uchun siz ushbu ustunning qiymatlari uchun noyob yorliq olasiz. Fo 1-ga qanday kodlanganiga e'tibor bering, ammo y.

# Ma'lumotlar panelida LabelEncoder-ni sinab ko'ring
pandalarni pd sifatida import qilish
l_encoder = preprocessing.LabelEncoder () # Yangi ob'ekt
df = pd.DataFrame (ma'lumotlar = {'col1': ['foo', 'bar', 'foo', 'bar'],
                          'col2': ['x', 'y', 'x', 'z'],
                          'col3': [1, 2, 3, 4]})
# Endi oson qismi uchun
df.apply (l_encoder.fit_transform)
>>
   kol1 col2 kol3
0 1 0 0
1 0 1 1
2 1 0 2
3 0 2 3

Endi biz tartibli kodlashga o'tmoqdamiz, unda xususiyatlar hali ham butun sonlar sifatida ifodalanadi, lekin ular joy va tuzilish tuyg'usiga ega. Bunday x y dan oldin va y z dan oldin keladi.

Biroq, biz bu erda kalitni tashlaymiz. Nafaqat buyurtma qilingan qiymatlar, balki ular bir-biri bilan bog'lanadi.

Biz ikki qator qiymatlarni olamiz ['foo', 'bar', 'baz'] va ['x', 'y', 'z']. Keyinchalik, har bir massivdagi har bir qiymatlar to'plamiga 0, 1 va 2 raqamlarini kiritamiz va har bir qiymat uchun kodlangan juft hosil qilamiz.

Masalan ['Foo', 'z'] [0, 2] bilan taqqoslanadi va ['baz', 'x'] bilan taqqoslanadi [2, 0].

Bu sizga bir nechta toifalarni olish va ularni regressiya qilish uchun kerak bo'lganda olish uchun juda yaxshi yondashuv, ayniqsa o'zaro bog'langan qatorlar - alohida kategoriyalar mavjud bo'lsa, ular bir-birlari bilan bir-biriga zid bo'lgan va ma'lumotlar panelida taqdim etilishini talab etganda juda yaxshi. .

sklearn.preprocessing import OrdinalEncoder-dan
o_encoder = OrdinalEncoder ()
ary_2d = [['foo', 'bar', 'baz'], ['x', 'y', 'z']]
o_encoder.fit (2d_ary) # qiymatlarni moslash
o_encoder.transform ([['foo', 'y']])
>> qatori ([[0., 1.]])

Klassik bitta issiq yoki "dummy" kodlash, bu erda kategoriyalarning yagona xususiyatlari 0s yoki 1s qo'shimcha ustunlari shaklida ifodalanadi, bunga qarab qiymat paydo bo'ladi yoki yo'q. Ushbu jarayon har bir kategoriya uchun ikkilik ustun hosil qiladi va siyrak matritsani yoki zich qatorni qaytaradi.

Https://blog.myyellowroad.com/ saytiga kredit

Nima uchun bundan foydalanasiz? Chunki ushbu turdagi kodlash kategoriya ma'lumotlarini ko'plab chiziqli regressiya modellari va SVMlar kabi ko'plab skitit modellariga etkazib berish uchun kerak. Shunday qilib, bu bilan qulay bo'ling.

sklearn.preprocessing import OneHotEncoder-dan
hot_encoder = OneHotEncoder (handle_un unknown = 'e'tibor bermaslik')
hot_encoder.fit (ary_2d)
hot_encoder.categories_
>>
[qator (['foo', 'x'], tip = ob'ekt), qator (['bar', 'y'], dtype = ob'ekt), qator (['baz', 'z'], dtype = ob'ekt) )]
hot_encoder.transform ([['foo', 'foo', 'baz'], ['y', 'y', 'x']]).
>>
qator ([[1, 0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0., 0.]]))

Agar bizda ishlaydigan ma'lumot uzatadigan dastur bo'lsa nima bo'ladi?

Biz hali ham bitta issiq kodlashni ishlata olamizmi? Aslida, siz o'ylaganingizdan osonroq, chunki pandaga kiritilgan .get_dummies () ni ishlatish kifoya.

pd.get_dummies (df)
      col3 col1_bar col1_foo col2_x col2_y col2_z
0 1 0 1 1 0 0
1 2 1 0 0 1 0
2 3 0 1 1 0 0
3 4 1 0 0 0 1

Df-dagi uchta ustunlardan ikkitasi bo'linib, ikkilik ma'lumot tizimiga kodlangan.

Masalan Col1_bar ustuni df dan col1, lekin satr asl ma`lumot oynasida qiymat bo'lganida 1 qiymatiga ega.

Qachon bizning xususiyatlarimiz ma'lum bir hududda o'zgarishi kerak bo'lsa-chi? MinMaxScaler-dan foydalanib, har bir xususiyat alohida berilgan bo'lishi mumkin, shunda u berilgan diapazonda bo'ladi. Odatiy bo'lib, qiymatlar 0 dan 1 gacha, ammo siz diapazonni o'zgartirishingiz mumkin.

sklearn.preprocessing import MinMaxScaler-dan
mm_scaler = MinMaxScaler (xususiyat_range = (0, 1)) # 0 dan 1 gacha
mm_scaler.fit ([ary_int])
>> MinMaxScaler (nusxa = To'g'ri, xususiyat_range = (0, 1))
bosib chiqarish (scaler.data_max_)
>> [5. -41. -67. 23. -53. -57. -36. -25. 10. 17.]
bosib chiqarish (mm_scaler.fit_transform ([ary_int]))
>> [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] # Humm narsa noto'g'ri

Agar siz chiqadigan narsalarning barchasini nolga tengligini ko'rsangiz, bu biz istagan narsaga o'xshamaydi. Bu erda va bu erda nima uchun bunday bo'lganligi haqida yaxshi tushuntirish mavjud, ammo qisqa hikoya, qator noto'g'ri formatlangan.

Bu (1, n) matritsa va uni (n, 1) matritsaga aylantirish kerak. Buning eng oson usuli bu sizning massivingiz notekis ekanligiga ishonch hosil qilishdir, shuning uchun siz shaklni boshqarishingiz mumkin.

# Uyqusiz qator yaratish
ary_int = np.array ([5, -41, -67, 23, -53, -57, -36, -25, 10, 17])
# O'zgarish
mm_scaler.fit_transform (ary_int [:, np.newaxis])
>>
qator ([[0.8],
       [0.28888889],
       [0. ],
       [1. ],
       [0.15555556],
       [0.11111111],
       [0.34444444],
       [0.46666667],
       [0.85555556],
       [0.93333333]])
# Bundan tashqari foydalanishingiz mumkin
mm_scaler.fit_transform (ary_int.reshape (-1, 1))
# Boshqa o'lchovni ham sinab ko'ring
mm_scaler = MinMaxScaler (xususiyat_range = (0, 10))
mm_scaler.fit_transform (ary_int.reshape (-1, 1))
>>
qator ([[8.],
       [2.88888889],
       [0.],
       [10. ],
       [1.55555556],
       [1.11111111],
       [3.44444444],
       [4.66666667],
       [8.55555556],
       [9.33333333]])

Endi biz ma'lumotlarimizni tezda ko'lamini kengaytira olsak, o'zgartirilgan ma'lumotlarga qandaydir shakl berish haqida nima deyish mumkin? 0 va sd o'rtacha 1 ga teng bo'lgan gaussian qiymatini beradigan ma'lumotni standartlashtirishni ko'rib chiqmoqdamiz. Agar siz gradient tushishini amalga oshirayotganda yoki sizga regressiya va og'irlikdagi qo'shimcha ma'lumot kerak bo'lsa, ushbu yondashuvni ko'rib chiqishingiz mumkin. neyron tarmoqlari. Bundan tashqari, agar siz KNN-ni amalga oshirmoqchi bo'lsangiz, avval o'zingizning ma'lumotlaringizni kattalashtiring. E'tibor bering, bu yondashuv normallashtirishdan farq qiladi, shuning uchun chalkashib ketmang.

Dastlabki ishlov berishdan shkaladan foydalaning.

oldindan ishlov berish (foo)
>> qator.
oldindan ishlov berish (foo) .mean ()
>> -4.4408920985006264e-17 # Aslida nol
 oldindan ishlov berish (foo) .std ()
>> 1.0 # Aynan biz xohlagan narsa

Binarizerni ko'rib chiqadigan so'nggi skelet paketi bu siz hali ham 0 va 1s-larni olmoqdasiz, ammo endi ular sizning shartlaringiz asosida aniqlanadi. Bu mantiqiy qiymatlarni olish uchun raqamli belgilarning jarayoni. Cheklovdan kattaroq qiymatlar 1 ga, ≤ esa 0 ga tenglashtiriladi. Shuningdek, hujjat yoki korpus ichidagi davriy chastotalarni olish uchun matnni qayta ishlash paytida bu odatiy jarayon.

Shuni yodda tutingki, fit () va transform () ikkala qatorni talab qiladi, shuning uchun men ary_int-ni boshqa massivga joylashtirdim. Ushbu misol uchun men pol qiymatini -25 deb belgilab qo'ydim, shuning uchun har qanday raqamdan yuqoriroq bo'lgan har qanday raqamlarga 1 beriladi.

sklearn.preprocessing import Binarizer-dan
# -25 ni bizning chegaramiz sifatida belgilang
tz = Binarizer (chegara = -25.0) .fit ([ary_int])
tz.transform ([ary_int])
>> qatori ([[1, 0, 0, 1, 0, 0, 0, 0, 1, 1]])

Endi bizda bir nechta turli xil texnikalar mavjud, ulardan qaysi biri sizning algoritmingiz uchun eng yaxshisi? Masshtablangan ma'lumotlar, o'chirilgan ma'lumotlar va hokazo bilan bir nechta turli xil oraliq ma'lumotlar formatlarini saqlash yaxshiroqdir, shuning uchun siz o'zingizning modellaringizning natijalariga ta'sirini ko'rishingiz mumkin.

Yakuniy fikrlar

Ma'lumotni tozalash va oldindan tayyorlash muqarrar va odatda ma'lumot ilmiga kelganda minnatdorliksiz ish. Agar sizning ishingizni osonlashtirish uchun ETL quvurlarini o'rnatishda sizga yordam beradigan ma'lumot muhandislik guruhiga ega bo'lish imkoniga ega bo'lsangiz, unda siz ma'lumot olimlari ozchiligiga qo'shilishingiz mumkin.

Hayot shunchaki Kaggle ma'lumotlar to'plami emas, aslida siz har kuni kerakli ma'lumotlarga kirish va tozalash haqida qaror qabul qilishingiz kerak. Ba'zida hamma narsa o'z joyida ekanligiga ishonch hosil qilish uchun ko'p vaqtingiz bo'ladi, lekin ko'p hollarda javob berishingizga to'g'ri keladi. Agar sizda kerakli vositalar mavjud bo'lsa va ular mumkin bo'lgan narsani tushunsangiz, bu javoblarga osongina kirishingiz mumkin.

Har doimgidek, siz biron bir yangi narsani bildingiz deb umid qilaman.

Salomlar,

Qo'shimcha o'qish