انتخاب ویژگیها براساس همبستگی و p-value

زمانی که یک دیتاست رو در اختیار داریم ممکنه اطلاعات زیادی رو در اختیار ما قرار بده که بسیاری از این ویژگیها ممکنه در ساختن مدل ماشین لرنینگ که برای ما مفید نباشن. استفاده از بسیاری ازین ویژگیها ممکن است فرآیند پیش بینی رو مختطل بکنه و ما حتی در پیش بینی دقیقی را نتونیم ارائه بدیم .انتخاب ویژگی های درست دقیق برای پیش بینی نقش بسیار مهمی رو در ساختن یک مدل کار امد بازی میکنه. در اینجا قصد داریم نحوه انتخاب متغییرهای مفید برای fit کردن رو بررسی کنیم .همبستگی چیست؟؟؟همبستگی یه اصطلاح آماری است که بررسی میکند آیا دو متغییر به یکدیگر وابسته هستند یا خیر.همبستگی چگونه به انتخاب متغییر کمک میکند؟؟ویژگی هایی با همبستگی بالا به صورت خطی با یکدیگر وابسته هستند و از این رو تقریباً تأثیر یکسانی بر متغیر وابسته دارند. بنابراین ، هنگامی که دو ویژگی از همبستگی بالایی برخوردار هستند ، می توانیم یکی از این دو ویژگی را رها کنیم.پ.p-value :پیش از فهمیدن p-value ما ابتدا باید در رابطه با فرض صفر بدونیم خب null hypothesis یه جمله عمومی است که بیان میکند هیچ ارتباطی بین دو متغییر وجود ندارد.تست (قبول , اثبات , رد کردن ) فرض صفر(H0) یک وظیفه اساسی در تمرین مدرن در علوم داده میباشد ; حوزه آمار معیارهای دقیقی برای رد فرض صفر(H0) ارائه می دهد.منبع : ویکی پدیا برای اطلاعات بیشتر میتوانید فرض صفر لینک بالا رو چک کنید.خب p-value چیست؟؟؟خب p-value به ما این احتمال را می دهد که یک فرضیه خاص را صحیح بدانیم. از این احتمال برای پذیرش یا رد آن فرضیه استفاده می شود.چطور p-value در انتخاب ویژگی ها به ما کمک میکند؟؟حذف ویژگی های مختلف از مجموعه داده ها ، تأثیرات متفاوتی برp-value برای دیتاست خواهد گذاشت. ما می توانیم ویژگی های مختلفی را حذف کرده وp-value را در هر حالت اندازه گیری کنیم. این p-value اندازه گیری شده می تواند برای تصمیم گیری در مورد حفظ یا نبودن ویژگی استفاده شود.ساختن مدل بدون انتخاب متغییر :در زیر مدل خود رو با داده هایی که داریم آموزش میدهیم و فیدبک میگیریم تا ببینم استفاده از روشهای بالا در انتخاب ویژگیها چقدر در دقت نتیجه به ما کمک کرده است:data = pd.read_csv('../input/data.csv') result = pd.DataFrame() result['diagnosis'] = data.iloc[:,1] data = data.iloc[:,2:-1] label_encoder = LabelEncoder() data.iloc[:,0] = label_encoder.fit_transform(data.iloc[:,0]).astype('float64') x_train, x_test, y_train, y_test = train_test_split(data.values, result.values, test_size = 0.2) svc = SVC() svc.fit(x_train, y_train) prediction = svc.predict(x_test) cm = confusion_matrix(y_test, prediction) sum = 0 for i in range(cm.shape[0]): sum += cm[i][i] accuracy = sum/x_test.shape[0] print(accuracy)دقت نتیجه در این حالت تقریبا برابر است با :0.70 پیاده سازی انتخاب به روش انتخاب ویژگیها:در اولین قدم نیاز داریم تا لایبرریهای خود رو اضافه کنیم ما در اینجا از کتابخانه پایتون استفاده میکنیم البته در پستهای بعدی امیدوارم بتونیم با R هم کار کنیم import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.preprocessing import LabelEncoder, OneHotEncoder import warnings warnings.filterwarnings(&quotignore&quot) from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import confusion_matrix np.random.seed(123)لود کردن دیتاستdata = pd.read_csv('../input/data.csv' , sep=',')حذف ستون ID و ستونهای بی نام :data = data.iloc[:,1:-1]مرحله بعد رمزگذاری متغییرهای categorical میباشد: متغییرهایCategoricallabel_encoder = LabelEncoder() data.iloc[:,0] = label_encoder.fit_transform(data.iloc[:,0]).astype('float64')انتخاب متغییرها براساس همبستگی :محاسبه همبستگی برای کلیه متغییرهاcorr = data.corr()براری درک بهتر رابطه بین این متغییرها بهتر است از گراف هیت مپ برای به تصویر کشیده مقدار همبستگی ها استفاده کنیم. در اینجا از کتابخانه seaborn استفاده میکنیم sns.heatmap(corr)همبستگی بین متغییرهادر مرحله بعد ما همبستگی بین ویژگیها رو مقایسه میکنیم و چند ویژگی که ضریب همبستگی آن بیشتر از 0.9 بود حذف میکنیم columns = np.full((corr.shape[0],), True, dtype=bool) for i in range(corr.shape[0]): for j in range(i+1, corr.shape[0]): if corr.iloc[i,j] >= 0.9: if columns[j]: columns[j] = False selected_columns = data.columns[columns] data = data[selected_columnالان دیتاست ما ویژگیهایی با همبستگی کمتر از 0.9 رو شامل میشودانتخاب ویژگیها براساس p-value:در مرحله بعد انتخاب ویژگیها براساس نحوه تاثیرشون بر p-value خواهد بود.در اینجا ابتدا میبایست ستون diagnosis را حذف میکنیم این ویژگی هست که قصدداریم پیش بینی را رو ی اون انجام بدیم .selected_columns = selected_columns[1:].values import statsmodels.formula.api as sm def backwardElimination(x, Y, sl, columns): numVars = len(x[0]) for i in range(0, numVars): regressor_OLS = sm.OLS(Y, x).fit() maxVar = max(regressor_OLS.pvalues).astype(float) if maxVar > sl: for j in range(0, numVars - i): if (regressor_OLS.pvalues[j].astype(float) == maxVar): x = np.delete(x, j, 1) columns = np.delete(columns, j) regressor_OLS.summary() return x, columns SL = 0.05 data_modeled, selected_columns = backwardElimination(data.iloc[:,1:].values, data.iloc[:,0].values, SL, selected_columns) کاری که بالا انجام دادیم اینه که :فرض کردیم که فرض صفر ما درسته : "ترکیبی از متغیرهای وابسته هیچ تاثیری در متغیر مستقل ندارد".در مرحله بعد یک مدل رگرسیونی ساختیم و براش اون مدل p-value رو محاسبه کردیماگر مقدارp-value ما بیشتر از مقدار آستانه باشه این ترکیب از ویژگیها رو در نظر نمیگیرم.در مرحله بعد یه دیتا فریم جدید برای نتیجه میسازیم ویه دیتا فریم دیگه که از نتیجه p-value و همبستگی استفاده میکینم result = pd.DataFrame() result['diagnosis'] = data.iloc[:,0] data = pd.DataFrame(data = data_modeled, columns = selected_columns)بصری سازی ویژگیهای انتخاب شده:تصاویر زیر نحوه توزیع ویژگیها رو نشون میدهfig = plt.figure(figsize = (20, 25)) j = 0 for i in data.columns: plt.subplot(6, 4, j+1) j += 1 sns.distplot(data[i][result['diagnosis']==0], color='g', label = 'benign') sns.distplot(data[i][result['diagnosis']==1], color='r', label = 'malignant') plt.legend(loc='best') fig.suptitle('Breast Cancer Data Analysis') fig.tight_layout() fig.subplots_adjust(top=0.95) plt.show()خب حالا میرسیم به مراحل آخر کار تقسیم دیتا به دیتای آموزش و تست:x_train, x_test, y_train, y_test = train_test_split(data.values, result.values, test_size = 0.2)ساختن یه مدل با داده های انتخاب شده :در این مثال ما از SVM برای پیش بینی استفاده میکنیم :svc=SVC() # The default kernel used by SVC is the gaussian kernel svc.fit(x_train, y_train)خب حالا به مرحله ای رسیدیم که میتونیم نتیجه اعمالمون رو ببینیم و دقتشو بررسی کنیم :prediction = svc.predict(x_test)در اینجا از confusion matrix استفاده میکنیم:cm = confusion_matrix(y_test, prediction) sum = 0 for i in range(cm.shape[0]): sum += cm[i][i] accuracy = sum/x_test.shape[0] print(accuracy)دقت نهایی ما تقریبا برابر است با 0.93هیمنطور که میبینید این دقت نتیجه به طرز خارق العاده ای افزایش پیدا کرد از حدود 0.7 به 0.93 !!!!با تشکر:-))