نویسنده: ازکیل لانزا
این آموزش یک مورد استفاده را ارائه می دهد که در آن یک شرکت کارت اعتباری ممکن است از تکنیک های یادگیری ماشین برای پیش بینی تراکنش های جعلی بهره مند شود. این قسمت اول از یک مجموعه سه قسمتی است.
در این پست، داده ها را با Intel® Distribution of Modin* آماده و پیش پردازش می کنید. همچنین از یک مجموعه داده ناشناس استخراج شده از Kaggle* استفاده خواهید کرد.
Intel® Distribution of Modin به شما کمک می کند تا با استفاده از API مشابه پانداها، عملیات را سریعتر اجرا کنید. این کتابخانه کاملاً با پانداهای API سازگار است. OmniSci* پشتیبان را تقویت می کند و تجزیه و تحلیل سریعی را در پلتفرم های Intel® ارائه می دهد. (در اینجا دستورالعمل نصب آمده است.)
توجه: Modin در حال حاضر اجرای توزیع شده را برای همه متدها از pandas API پشتیبانی نمی کند. روش های اجرا نشده باقی مانده در حالتی به نام “پیش فرض برای پانداها” اجرا می شوند. این به کاربران اجازه می دهد تا به استفاده از Modin ادامه دهند، حتی اگر بارهای کاری آنها دارای توابعی باشد که هنوز در Modin پیاده سازی نشده است.
اولین قدم این است که داده ها را از قبل پردازش کنید. پس از دانلود و استخراج داده ها، آنها را در قالب صفحه گسترده خواهید داشت. این بدان معناست که شما با داده های جدولی کار خواهید کرد که در آن هر ردیف یک تراکنش (مثال) و هر ستون یک ویژگی (مقدار تراکنش، محدودیت اعتبار، سن) است. در این آموزش نمی دانید کدام یک نشان دهنده هر ویژگی است، زیرا داده ها به منظور حفظ حریم خصوصی ناشناس شده است. این مثال از یادگیری نظارت شده استفاده می کند، به این معنی که الگوریتم بر روی مجموعه ای از مثال های از پیش تعریف شده آموزش داده شده است. نمونه ها با یک ستون به نام LABEL (تقلب یا نه تقلب) برچسب گذاری شده اند (تصویر 2).
در یک مورد واقعی، دادهها میتوانند از چندین منبع (مانند SQL، Oracle Database* یا Apache Spark*) به دست آیند. ایده این است که یک فایل صفحه گسترده برای قرار دادن در الگوریتم برای آموزش آن وجود داشته باشد. برای انجام این کار، باید چندین فایل را به هم بپیوندید یا به هم بپیوندید تا یک مجموعه داده اصلی را به دست آورید. پیوستن چندین منبع می تواند منجر به یک مجموعه داده اصلی با هزاران خط و صدها ستون شود. کار با چنین فایل بزرگی می تواند بر روی رایانه/سرور شما برای حافظه و پردازش فشار وارد کند، بنابراین استفاده از چارچوب های بهینه برای سرعت بخشیدن به این کار مهم است.
ابتدا مجموعه داده را بارگذاری کنید. شما هم از پانداهای معمولی و هم از Modin-Panda های بهینه شده (pd) استفاده خواهید کرد. با استفاده از هر دو، زمانی که دستگاه شما از تمام هسته های خود به جای استفاده از یک هسته استفاده می کند، تفاوت را مشاهده خواهید کرد. این نشان می دهد که چگونه Modin می تواند کمک کند.
t0 = time.time() pandas_df = pandas.read_csv("…creditcard.csv")
pandas_time = time.time()- t0
t1 = time.time()
modin_df = pd.read_csv("…creditcard.csv")
modin_time = time.time() - t1
همانطور که می بینید، نتایج می توانند تا 18 برابر سریعتر باشند (توجه: نتایج بسته به CPU / حافظه انتخابی Intel(R) + مجموعه داده متفاوت است.)
اکنون که مجموعه داده در حافظه شما بارگذاری شده است، نگاه دقیق تری بیندازید.
یکی از اولین مراحل در تجزیه و تحلیل داده ها، بررسی مقادیر از دست رفته است، زیرا اکثر الگوریتم ها نمی توانند داده های از دست رفته را مدیریت کنند. این راستیآزمایی کوتاهنویسی مفیدی برای بررسی دقیق بودن دادهها است. مهم است که بدانید مشکل چقدر بزرگ است تا نحوه رسیدگی به آن را تعیین کنید. به عنوان مثال، 80% مقادیر از دست رفته نشان دهنده یک مجموعه داده بد است، اما زمانی که این عدد به 5% نزدیکتر باشد مشکلی نیست.
راه های متعددی برای رفع این مشکل وجود دارد. هیچ تصمیم خوب یا بدی وجود ندارد، آنها را امتحان کنید و ببینید الگوریتم با هر کدام چگونه عمل می کند.
- خطوط دارای مقادیر گم شده را حذف کنید. اگر مقادیر زیادی از دست رفته وجود نداشته باشد، یک مجموعه داده کوچکتر مشکلی ایجاد نخواهد کرد.
- مقدار نسبت دادن یک مقدار را شبیه سازی کنید تا فیلد گم شده را پر کنید. ایده این است که از مثال (خط) استفاده کنید اما اثر مقادیر از دست رفته را کاهش دهید. سعی کنید مقدار میانگین/حداکثر/حداقل ویژگی (ستون) را جایگزین کنید. همچنین میتوانید براساس K-means، مقدار را با توجه به مقادیر دیگر (ستونها) پیشبینی کنید.
هنگامی که با داده های استخراج شده از منابع خارجی کار می کنید، ارزش آن را دارد که خرابی های سیستم را فاکتور بگیرید. این خرابیها به شکل گزارشدهی ناقص هستند – فقط گرفتن عکسهای فوری جزئی از مجموعه داده – و میتوانند منجر به از دست رفتن مقادیر شوند.
بیایید مقادیر از دست رفته را بررسی کنیم:
t0 = time.time() print(pandas_df.columns[pandas_df.isna().any()])
pandas_time = time.time()- t0
t1 = time.time()
print(modin_df.columns[modin_df.isna().any()])
modin_time = time.time() - t1
Index([], dtype='object')
Index([], dtype='object')
خوشبختانه در این مثال هیچ مقدار گم نشده ای وجود ندارد، بنابراین می توانید به نمونه گیری فرعی بروید.
به توزیع داده های خود نگاهی بیندازید.
sub_sample_plot=sns.countplot(pandas_df["Class"])
sub_sample_plot
واضح است که کلاس (FRAUD یا NO FRAUD) بسیار نامتعادل است. این بدان معناست که اکثر موارد کلاهبرداری نیستند و فقط تعداد کمی از آنها کلاهبرداری هستند.
برای آموزش یک مدل با کل مجموعه داده، مدل باید یاد بگیرد که چگونه اکثر موارد را شناسایی کند (NO FRAUD)، که آن چیزی نیست که ما میخواهیم: ما میخواهیم تقلب را شناسایی کنیم.
اگر مدلی با این داده ها آموزش داده شود، به سطوح بالایی از دقت می رسد، اما این نتیجه مورد نظر شما نیست. (بخش سوم این آموزش نحوه انتخاب یک معیار را بر اساس معیارهایی که به دنبال آن هستید توضیح می دهد.)
در اینجا چند راه برای حل این مشکل وجود دارد:
- نمونه های FRAUD بیشتری به دست آورید. از صاحب مجموعه داده مثال های بیشتری بخواهید. با این حال، معمولاً باید با مجموعه داده ای که دارید کار کنید.
- افزایش مثالهای FRAUD: اگر نمونههایی از کلاس وجود دارد که میخواهید شناسایی کنید، از یک الگوریتم برای تولید تعداد قابلتوجهی از نمونههای کلاس مورد نظر استفاده کنید. این راه حل عمدتا در سناریوهای بینایی کامپیوتری استفاده می شود اما برای دیگران نیز کار می کند.
- از یک مجموعه داده متفاوت استفاده کنید که در آن نسبت FRAUD به NO FRAUD نزدیک به 1:1 باشد.
اکنون شما آماده ایجاد یک مجموعه داده جدید با یک نسبت مفید برای تعمیم هر دو کلاس هستید.
ابتدا یک مجموعه داده متعادل جدید ایجاد کنید.
modin_df_sub = modin_df.sample(frac=1) #Shuffling the dataframe modin_df_sub_nf = modin_df_sub.loc[modin_df["Class"] == 0][:492]
modin_df_sub_f = modin_df_sub.loc[modin_df["Class"]==1]
# Will reuse all fraud points, will random sample out 492 non-fraud points
# New sample Table
modin_df_sub_distributed = pd.concat([modin_df_sub_nf,modin_df_sub_f])
modin_balanced = modin_df_sub_distributed.sample(frac=1, random_state=42)
مجموعه داده متعادل حاصل، آموزش الگوریتم را آسانتر میکند.
sub_sample_plot=sns.countplot(modin_balanced["Class"]) sub_sample_plot
اکنون دادههای لازم برای نشان دادن یک نمایش منصفانه از FRAUD و NO FRAUD را دارید. همچنین باید مشخص باشد که اینتل® Distribution of Modin چه مزایایی را ارائه می دهد – بدون تغییر کد.
در بخش دوم، داده ها را تحلیل و تبدیل می کنید و بخش سوم الگوریتم را آموزش می دهید.
گوش به زنگ باشید!
ازکیل لانزا یک مبشر متن باز در تیم اکوسیستم باز اینتل است که مشتاق کمک به مردم برای کشف دنیای هیجان انگیز هوش مصنوعی است. او همچنین یک مجری مکرر کنفرانس هوش مصنوعی و خالق موارد استفاده، آموزش و راهنماهایی است که به توسعه دهندگان کمک می کند تا ابزارهای AI منبع باز مانند TensorFlow* و Hugging Face* را بکار گیرند. او را در توییتر در @ پیدا کنیدeze_lanza