iliya faramarzi
iliya faramarzi
خواندن ۴ دقیقه·۱ سال پیش

ضریب تعیین(R2) چیست و چطور منفی میشود؟

امروز داشتم یک پروژه ماشین لرنینگ برای پیشبینی قیمت خونه های توی دیوار انجام میدادم که بعد از اینکه همه کار هارو کردم و مدل رو هم اموزش دادم(Train)، با نمره پیشبینی منفی مواجه شدم و برام عجیب و جالب بود که چجوری ممکنه که منفی بشه. امروز توی این مقاله توضیح کاملی راجع به ضریب R2 یا همون ضریب تعیین میدم و این اتفاق که ممکن برای شما هم بیوفته رو توضیح میدم.


فرمول محاسبه ضریب تعیین
فرمول محاسبه ضریب تعیین

ضریب تعیین یا R2 چیست؟

در آمار ضریب تعیین(Coefficient of Determination) یا همون R2(که 2 به صورت توان نشون داده میشه) نسبتی از واریانس برحسب متغیر وابسته است که از متغیر (های) مستقل قابل پیش‌بینی باشد. این شیوه یکی از شیوه های معروف محاسبه خطا در یادگیری ماشین(Machine learning) است که بیشتر در مباحث رگرسیون خطی(Linear Regression) استفاده میشه و هرچه به 1 نزدیک تر باشه یعنی مدل بهتر اموزش دیده و هرچی به صفر نزدیک تر بشه یعنی مدل نیاز به بهتر شدن داره.


فرمول محاسبه R2 در ماشین لرنینگ (شرمنده بابت کیفیت پایین)
فرمول محاسبه R2 در ماشین لرنینگ (شرمنده بابت کیفیت پایین)

محاسبه R2 در پایتون

برای اینکه نشون بدم که R2 توی پایتون چجوری بدست میاد ترجیح میدم از مثال استفاده کنم.

اول از همه نیازه که کتابخونه های مورد نیاز رو ایمپورت کنیم و بعد یک نمونه ساده از دیتا ها درست کنیم.

import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt x= np.array([[1],[2],[3],[4]]) y = np.array([[2],[4],[6],[8]])

بعد ساخت مثال ها یک نگاهی بهشون رو نمودار میندازیم، برای این کار من از کتابخونه matplotlib استفاده میکنم که شما میتونید از کتابخونه های دیگه پایتون استفاده کنید.

plt.plot(x, y, 'ro') plt.show()

و خروجی به صورت زیر میشه:

همینطور که تا الان متوجه شدید مثالی که زدم از یک دیتا بسیار بسیار ساده هست که با ریاضیات اول دبیرستان هم بدون استفاده از کامپیوتر میشه یک مدل براش طراحی کرد ولی خب ما اینجا قصد دیگه ای داریم پس میریم سراغ آماده کردن مدل:

reg = linear_model.LinearRegression() reg.fit(x, y)

اینجوری به ساده ترین روش ممکن مدلمون رو اموزش دادیم و حالا اگه بخوایم همین رو روی نمودار نشون بدیم به صورت زیر میشه:

خب حالا وقتشه که بریم R2 رو برای این مدلمون محسابه کنیم:

reg.score(x, reg.predict(x)) Out: 1.0

تابع score اینجا برامون همون کار R2 رو میکنه(sklearn به صورت جداگانه هم R2 رو داره و میتونید اون رو ایمپورت کنید و با اون هم امتحان کنید ولی جواب ها تفاوتی نمیکنه). میبینیم که جواب ما 1شد چرا؟ چونکه به صورت کامل و دقیق و بدون خطا میتونه داده هارو پیشبینی کنه ولی حالا بیاید یکم توی داده هامون تغییر ایجاد کنیم ببینم چه اتفاقی میوفته.

در مرحله اول من میخوام داده هایی که توی x ذخیره کردم رو معکوس کنم و با این داده های جدید نمودار رو رسم کنم.(از ~ برای معکوس کردن استفاده میکنیم)

plt.plot(x, y, 'ro') plt.plot(x, reg.predict(~x)) plt.show()

خب همونطور که میبینید خطی که مدل ما قراره باهاش داده های مارو پیشبینی کنه به صورت کلی قرینه شده و داره اشتباه کار میکنه، حالا چه تفاوتی توی R2 ایجاد میکنه؟

reg.score(x, reg.predict(~x)) Out: -31.799999999999997

خب همونطور که دیدید اونقدر مدل ما توی پیشبینی کردن افتضاح بود که جواب ما منفی شد :) حالا بریم و یکم توی ریاضیاتش بررسی کنیم ببینیم چه اتفاقی میوفته که جواب منفی به دست میاد.

بخش ریاضیات کار!

طبق عکس هایی که اول مقاله براتون گذاشتم میتونید متوجه بشین که جواب درست از جوابی که مدل برای ما پیشبینی کرده کم میشه و به توان 2 میرسه(توی صورت رو داریم بررسی میکنیم چون بیشتر تغییرات توی صورت کسر اتفاق میوفته). خب هرچه که جواب درست از چیزی که مدل ما پیشبینی کرده دور تر باشد تفاضل اون ها هم بیشتره میشه و باز چون به توان 2 میرسه باز این اختلاف خیلی خیلی بیشتر میشه و وقتی که این کسر از 1 بزرگتر بشه، چون جواب نهایی هست 1 منهای جواب کسر، پس جواب نهایی ما هم منفی تر میشه.


ایناها یعنی چی و باید چیکار کرد؟

همه ایناها به این معنی هستند که یا مدل ما درست اموزش داده نشده یا هم داده هایی که داریم داده های خوبی نیستند که البته مورد اول متحمل تره و باید روی مدلمون بیشتر کار کنیم و از متد های مختلف استفاده کنیم.


مرسی از اینکه تا اینجای مقاله رو خوندید، خیلی خوشحالم میکنید اگه نظرتون رو توی کامنت ها بگید و همچنین اگه دوست داشتید من رو توی صفحات مجازی دنبال کنید❤.

Linkedin

Telegram

Instagram

Github

از اینجا هم میتونی یک قهوه مهمونم کنی :)


منابع:

wikipedia.org

youtube.com

youtube.com

ریاضیپایتونpythonماشین لرنینگضریب تعیین
برنامه نویس و علاقه مند به تکنولوژی و علم و همچنین دوست دار شما❤ https://linktr.ee/iliyafaramarzi
شاید از این پست‌ها خوشتان بیاید