انتخاب ویژگیها براساس همبستگی و 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 میباشد:

متغییرهایCategorical
label_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 !!!!

با تشکر:-))