Машин сургалтын бодит хэрэглээнд, жишээ нь залилах илрүүлэлт, өвчний оношлогоо зэрэгт тэнцвэргүй өгөгдөл (нэг ангилал нөгөөгөөсөө хавьгүй их тоотой байх) түгээмэл тохиолддог. Энэ нь загваруудыг олонхи ангиллын талд хэт нэг талыг барьсан байдлаар сургах хандлагатай болгож, цөөнхийн ангиллыг зөв таамаглах чадварыг сулруулдаг гэж өмнөх нийтлэлээрээ бид ярилцсан.
Энэ асуудлыг шийдвэрлэх үр дүнтэй аргуудын нэг нь SMOTETomek юм. Энэ бол SMOTE (Synthetic Minority Over-sampling Technique) болон Tomek Links аргуудыг хослуулсан арга бөгөөд энэхүү блог дээр бид SMOTETomek-ийн хэрхэн ажилладаг, ямар үед ашиглах, Python дээр хэрхэн хэрэгжүүлэхийг ойлгомжтойгоор тайлбарлая.
SMOTETomek гэж юу вэ?
SMOTETomek нь тэнцвэргүй өгөгдлийг тэнцвэртэй болгох зорилготой хосолсон арга юм:
- SMOTE цөөнхийн ангиллыг хиймлээр нэмэгдүүлнэ (шинэ өгөгдлийг ойролцоо цэгүүдийн хооронд интерполяци хийж бүтээнэ)
- Tomek Links нь бие биедээ хамгийн ойр хэрнээ өөр ангилалтай хоёр өгөгдлийг олж, олонхийн талынхыг устгана
Өмнөх нийтлэл дээр дурьдсан SMOTE аргачлал нь шууд synthetic өгөгдлийг үүсгэдэг бөгөөд энэхүү арга нь худал буюу хуурамч өгөгдлүүдийг үүсгэх магадлалтай байдаг. Харин SMOTETomek аргачлалын хувьд Tomek links гэсэн аргачлалыг нэмсэнээр бид хоёр өөр ангилалд хамаарах, хамгийн ойрхон байрлалтай өгөгдлийн цэгүүдийг олдог.

1 ба 0 гэсэн хоёр ангилалтай байлаа гэж бодъё. Хэрвээ 1-ийн нэг өгөгдөл, 0-ийн нэг өгөгдөл хамгийн ойр байвал — энэ хоёрыг Tomek Link гэж нэрлэнэ. Ийм хосууд нь ангиллын хил дээр байрладаг учраас загварыг төөрөгдүүлж болдог.
Тиймээс Tomek Links ашиглан эдгээр хосуудын олонх ангилалд хамаарах өгөгдлийг устгаж, загварт цэвэр, ойлгомжтой хил бий болгодог.
Ингэснээр SMOTE болон Tomek link гэсэн энэхүү хоёр аргийг хамтад нь ашигласнаар илү сайн сургалтын өгөгдлийг бий болгоно.
Хэрэгжүүлэлт

1. Эхний ангиллын харьцаа: Counter({np.int64(0): 897, np.int64(1): 103})
2. SMOTE хийсний дараах харьцаа: Counter({np.int64(0): 897, np.int64(1): 897})
3-4. Tomek Links дараах цэвэр өгөгдөл: Counter({np.int64(0): 897, np.int64(1): 895})
Эцсийн боловсруулсан өгөгдөл: Counter({np.int64(0): 897, np.int64(1): 895})