نویسنده: ازکیل لانزا
این دومین آموزش از یک سری سه قسمتی است که یک مورد استفاده را ارائه می دهد که در آن یک شرکت کارت اعتباری ممکن است از تکنیک های یادگیری ماشین برای پیش بینی تراکنش های جعلی بهره مند شود.
در بخش اول، یک مجموعه داده متعادل تولید کردید. در این پست، برای بهبود الگوریتمها، تغییرات اساسی را روی دادههای باقیمانده انجام میدهید.
برای این آموزش، به scikit-learn* (sklearn.) نیاز دارید. این یک کتابخانه بسیار مفید و قوی برای یادگیری ماشین در پایتون* است. مجموعهای از ابزارهای کارآمد برای یادگیری ماشین و مدلسازی آماری از جمله طبقهبندی، رگرسیون، خوشهبندی و کاهش ابعاد را از طریق یک رابط سازگار در پایتون فراهم میکند. این کتابخانه که عمدتاً به زبان پایتون نوشته شده است، بر روی NumPy*، SciPy* و Matplotlib* ساخته شده است.
برنامه افزودنی Intel® for scikit-learn راهی برای سرعت بخشیدن به کدهای scikit-learn موجود را به شما ارائه می دهد. شتاب از طریق وصله به دست میآید: جایگزینی الگوریتمهای یادگیری scikit با نسخههای بهینهشده آنها که توسط افزونه ارائه شده است (راهنما را ببینید.) این بدان معناست که شما نیازی به یادگیری یک کتابخانه جدید ندارید، اما همچنان از مزایای استفاده از scikit، بهینهسازی شده بهره میبرید. .
مثال زیر مزایای آن را نشان می دهد.
پیش پردازش و تبدیل
یک اشتباه رایج این است که قبل از انجام جداسازی بین نمونههای فرعی قطار/آزمایش/معتبر، تمام تبدیلهای پیشپردازش روی دادهها انجام شود. در یک مورد واقعی، دادههایی که در دسترس خواهید داشت، دادههای آموزشی است در حالی که دادههای آزمایش همان چیزی است که میخواهید پیشبینی کنید. انجام تبدیل قبل از تقسیم به این معنی است که دادههای آموزشی را با اطلاعات موجود در مجموعه داده آزمایشی تبدیل میکنید، به این معنی که دادههای آلوده وجود خواهد داشت و نتایج مغرضانه خواهد بود.
چگونه می توانید از آن اجتناب کنید؟ ساده: با تقسیم داده ها. راه های متعددی برای انجام آن وجود دارد – به صورت تصادفی، وزن دار، در میان دیگران. در اینجا، شما آن را به طور تصادفی تقسیم خواهید کرد، اما با مثال های متعادل از هر دو کلاس (در صورت امکان 50/50). تقسیم در نسبت 80/20 تمرین خوبی است، به این معنی که 80٪ از داده های ما برای آموزش مدل استفاده خواهد شد. (یک مجموعه داده اعتبارسنجی وجود دارد که می تواند 20٪ از داده های قطار باشد، این در هنگام آموزش مدل برای دیدن عملکرد آن مفید است) و 20٪ برای تأیید عملکرد مدل با داده هایی استفاده می شود که مدل قبلاً هرگز ندیده است. .
به طور خلاصه، ما میتوانیم از کل مجموعه داده برای تجسم آن استفاده کنیم، اما به محض اینکه شروع به کار روی تبدیلها کردید، باید تقسیم شود.
اکنون دادهها را تغییر میدهید تا تشخیص رفتار الگوریتم برای آن آسانتر شود. اینها رایج ترین دگرگونی ها هستند و حتی در این صورت نیاز به صبر دارند. پس از آموزش مدل متوجه خواهید شد که آیا این تغییرات مفید بوده اند یا خیر. شما می توانید یک مدل را بدون هیچ تغییری آموزش دهید، اما به شدت توصیه می شود ابتدا داده ها را تغییر دهید.
تبدیل را می توان به عنوان اصلاح داده بدون تغییر الگوهای آن درک کرد. برای مثال، اگر یک ویژگی به نام “سن” دارید که در مقادیر بین 0 تا 100 نمایش داده می شود، ممکن است در گروه هایی مانند جوان (0)، بزرگسال (1)، سالمند (2) نمایش داده شود.
همیشه ایده خوبی است که داده ها را مقیاس بندی کنید تا اثر داده های نمایش داده شده در محدوده های مقدار کاهش یابد. این مدل ممکن است به سمت ویژگیهایی با اعداد بزرگتر منحرف شود، برای مثال اگر «سنت مشتری» از 0 تا 20 نشان داده شود و «مبلغ تراکنش» بین 1000 تا 10000000 باشد، مدل ممکن است «مبلغ تراکنش» را بیشتر از ارشدیت مشتری وزن کند. که ممکن است درست باشد، اما اگر مدل با داده هایی در این قالب آموزش داده شود، مغرضانه خواهید بود.
همانطور که از خروجی داده قطار می بینید، بیشتر ویژگی ها این تصور را به ما می دهند که “مقیاس” هستند به جز “زمان” و “مقدار” که اعداد بزرگتری دارند. از استفاده از داده ها به شکل فعلی خودداری کنید زیرا مدل «زمان» و «مقدار» را به عنوان دو ویژگی مهم تفسیر می کند.
اگر مقدار و یک ویژگی (V1، نارنجی) را ترسیم کنید، متوجه خواهید شد که آن مقدار (آبی) بسیار کمتر به نظر می رسد و اصلاً در مرکز نیست. این به این دلیل اتفاق میافتد که مقادیر V1 و مقدار بسیار متفاوت هستند، و بر نحوه یادگیری مدل ما از این ویژگیها تأثیر میگذارد.
X_train['Amount'].plot(kind='kde',xlim=(100,100)) X_train['V1'].plot(kind='kde',xlim=(-100,100))
بیایید اکنون داده ها را مقیاس بندی کنیم. ایده این است که همان توزیع “کوچکتر” را حفظ کنیم، که نشان دهنده داده های اولیه بین همان محدوده تعریف شده برای همه ویژگی ها است.
ابزارها و گزینه های متعددی برای مقیاس وجود دارد و می توانید آن را به صورت دستی انجام دهید، اما scikit-learn* یک API برای کمک به این کار دارد. این به داده هایی که داریم بستگی دارد (در اینجا راهنمای خوبی برای انتخاب محاسبات مفید است).
در مثال ما دادهها را با استفاده از تابع StandardScale (الگوریتم پیشروی صنعت) مقیاسبندی میکنیم، میتوانید سایرین را به عنوان RobustScaler امتحان کنید. StandardScaler به این معنی است که هر ویژگی دارای میانگین 0 خواهد بود و هر مقدار بر انحراف استاندارد تقسیم می شود. هدف شما این است که سعی کنید توزیع داده ها را متمرکز کنید تا تأثیر متغیرهایی را که در مقیاس متفاوتی هستند کاهش دهید. توجه داشته باشید که اگر دادههای ما دارای مقادیر پرت هستند (همانطور که در زیر توضیح داده شد)، باید سعی کنیم با استفاده از مقیاسکنندههای دیگر مانند RobustScaler اثر را کاهش دهیم.
standard = StandardScaler() data_st = standard.fit_transform(X_train) # This function gives the data as an array
# convert the array back to a dataframe
dataset_std = DataFrame(data_st, columns=col_names) #The col_names was extracted when StandardScaler converted the dataset
dataset_std.describe()
همانطور که می بینیم بعد از استفاده از StandarScaler همه ویژگی ها در مرکز 0 قرار می گیرند. مهمتر از آن، مدل اکنون می تواند رفتار همه ویژگی ها را ببیند.
اکنون که داده ها تقریباً برای آموزش مدل ما آماده هستند، یک چیز مهم دیگر برای بررسی وجود دارد. اکنون به خوبی سازماندهی شده است، اما هنوز هم میتوانیم مقادیری را در ویژگیها (ستونها) پیدا کنیم که میتوانند بر مدل تأثیر بگذارند، زیرا ممکن است وجود یک نقطه دورتر باشد.
نقطه پرت مقداری است که فاصله آن از مقادیر دیگر غیرعادی (غیر معمول) است. برای مثال، اگر بیشتر تراکنشهای مشتری (میانگین) حول یک مقدار جمع شوند، فرض کنید 100 دلار است. یک معامله پرت یک میلیون دلار است و استفاده از این مقدار برای آموزش مدل ما تأثیر منفی خواهد داشت زیرا فرآیند آموزش را گمراه می کند و در نتیجه زمان آموزش طولانی تر، مدل های دقیق تر و در نهایت نتایج ضعیف تر را به همراه دارد.
بنابراین، باید بدانید که چگونه با این مقادیر، چه خفیف و چه شدید، رفتار کنید. موارد پرت باید به دقت بررسی شوند. آنها اغلب حاوی اطلاعات ارزشمندی در مورد فرآیند تحت بررسی یا فرآیند جمعآوری و ثبت دادهها هستند – یک خطا ممکن است اعداد اضافی را اضافه کند و باعث شود که مقدار به عنوان یک مقدار پرت به نظر برسد. قبل از بررسی حذف، سعی کنید بفهمید که چرا آنها ظاهر شدند و آیا مقادیر مشابه احتمالاً همچنان ظاهر می شوند یا خیر. البته، نقاط پرت اغلب نقاط داده بد هستند.
در این مثال، شما مقادیری را که سه برابر از محدوده بین چارکی فاصله دارند (تفاوت بین 25٪ و 75٪ داده ها) که به آنها پرت شدید گفته می شود (1.5 فاصله پرت معمولی است) را حذف می کنید، زیرا شما اینطور نیستید. قادر به درک داده ها هستند (ناشناس هستند و ما نمی دانیم داده ها چگونه استخراج شده اند.) برای شناسایی آنها، می توانید از دو تکنیک گرافیکی، نمودار جعبه و نمودار پراکنده استفاده کنید.
در اینجا یک مثال آورده شده است، با توجه به اینکه در سناریوی واقعی با اطلاعات بیشتر در مورد ویژگی ها می توانید بیشتر بررسی کنید.
# Example to plot the outliers for 1 feature. You'll be using V5 fig = plt.figure(figsize =(10,5))
# Creating plot
plt.boxplot(X_train['V1'].loc[X_train['Class'] == 1],whis=3) # "whis" is to define the range of IQR, you’ll only find extreme values on FRAUD class
# show plot
plt.show()
## # Example to plot the outliers for 1 feature # # V1
v1_fraud = X_train['V1'].loc[X_train['Class'] == 1].values
q25, q75 = np.percentile(v1_fraud, 25), np.percentile(v1_fraud, 75)
print('Quartile 25: {} | Quartile 75: {}'.format(q25, q75))
v1_iqr = q75 - q25
print('iqr: {}'.format(v1_iqr))
v1_cut_off = v1_iqr * 3
v1_lower, v1_upper = q25 - v1_cut_off, q75 + v1_cut_off
print('Cut Off: {}'.format(v1_cut_off))
print('V5 Lower: {}'.format(v1_lower))
print('V5 Upper: {}'.format(v1_upper))
outliers = [x for x in v1_fraud if x < v1_lower or x > v1_upper]
print('Feature V5 Outliers for Fraud Cases: {}'.format(len(outliers)))
print('V5 outliers:{}'.format(outliers))
اکنون می توانید آن موارد پرت را حذف کنید. به یاد داشته باشید که این فرآیند را فقط یک بار انجام دهید، زیرا هر بار که آن را انجام میدهید، مقادیر پرت جدید را کشف کرده و مجموعه داده را کاهش میدهید.
در مرحله بعد، نگاهی به این مقادیر بیندازید. شما باید تمام ویژگی ها را تکرار کنید تا نقاط پرت شدید در هر یک را حذف کنید.
# Let's remove the outliers for feature in X_train.columns.difference(['Class']): # Loop into each feature except class
feature_fraud = X_train[feature].loc[X_train['Class'] == 1].values
q25, q75 = np.percentile(feature_fraud, 25), np.percentile(feature_fraud, 75)
feature_iqr = q75 - q25
feature_cut_off = feature_iqr * 3
feature_lower, feature_upper = q25 - feature_cut_off, q75 + feature_cut_off
outliers = [x for x in feature_fraud if x < feature_lower or x > feature_upper]
X_train = X_train.drop(X_train[(X_train[feature] > feature_upper) | (X_train[feature] < feature_lower)].index)
print('Number of Instances after outliers removal: {}'.format(len(X_train)))
همانطور که می بینید، مجموعه داده ما کاهش یافته است، اما هنوز به اندازه کافی برای آموزش مدل شما وجود دارد. این دیگر یک نسبت 50/50 نیست. در صورت تمایل می توانید دوباره تقسیم کنید تا 50/50 بدست آورید. با این حال، 57/42 هنوز هم نسبت خوبی بین موارد FRAUD و NO FRAUD است.
print('No Frauds', round(X_train['Class'].value_counts()[0]/len(X_train) * 100,2), '% of the dataset') print('Frauds', round(X_train['Class'].value_counts()[1]/len(X_train) * 100,2), '% of the dataset')No Frauds 57.82 % of the dataset
Frauds 42.18 % of the dataset
در نهایت، یک اصلاح مهم دیگر برای ایجاد مجموعه داده وجود دارد. مهندسی ویژگی (FE) یا به معنای افزودن ویژگی هایی است که وجود ندارد و به الگوریتم کمک می کند تا الگوها را در داده ها تشخیص دهد. دانشمندان داده آن را یک هنر می نامند زیرا شما باید بفهمید که کدام ویژگی می تواند به شما کمک کند و این شامل درک عمیق داده ها است. این یک فرآیند آزمون و خطا است. نگران نباشید اگر این ویژگی جدید هنگام آزمایش نتایج کار نمی کند. ابزارهای یادگیری ماشین خودکار (AutoML) می توانند کمک کنند. آنها بهطور خودکار پارامترها را آزمایش میکنند تا بتوانید ترکیبهای «بهینه» ویژگیهایی را که میتوانند در طول آموزش نیز استفاده شوند، پیدا کنید.
به عنوان مثال، اگر شرح هر ویژگی را می دانید، فرض کنید دو ویژگی به نام های “مقدار” و “سن” وجود دارد. میتوانید یک ویژگی جدید به نام «میزان صرف شده بر اساس سن» ایجاد کنید، سپس تابعی ایجاد کنید که محدودههای سنی را تقسیم کرده و آنها را بر اساس مقدار هزینه شده هش کند. در برخی موارد، می تواند فقط یک مقدار مقوله ای باشد. در اینجا، داده ها ناشناس هستند، بنابراین افزودن ویژگی ها دشوار است، اما مهم است که از FE آگاه باشید.
در این آموزش، مهمترین تکنیکهای پیشپردازش برای استفاده در یک مشکل دادههای جدولی مانند پرونده تشخیص تقلب را برجسته کردیم.
اکنون دادههای شما آماده استفاده برای آموزش یک مدل هستند (قسمت سوم.) مراحل پیش پردازش و آموزش یک فرآیند تکراری است که در آن تبدیلهای انجام شده ممکن است به آموزش الگوریتم کمک کند یا نکند. به یاد داشته باشید که هدف شما داشتن الگوریتمی است که بتواند در آخرین مرحله روی داده های دیده نشده به خوبی کار کند. ممکن است مجبور شوید این فرآیند را چندین بار تکرار یا تغییر دهید تا به آنجا برسید.
منتظر قسمت سوم باشید
برای محتوای متن باز بیشتر از اینتل، بررسی کنید open.intel
Ezequiel Lanza، اوانجلیست متن باز. علاقه مند به کمک به مردم برای کشف دنیای هیجان انگیز هوش مصنوعی، Ezequiel یک مجری مکرر کنفرانس هوش مصنوعی و خالق موارد استفاده، آموزش ها و راهنماهایی است که به توسعه دهندگان کمک می کند ابزارهای AI منبع باز مانند TensorFlow* و Hugging را بکار گیرند. صورت*. او را در توییتر پیدا کنید @eze_lanza
عکس از Clay Banks در Unsplash