از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تجزیه و تحلیل تشخیص خطی (LDA) در پایتون با Scikit-Learn
سرفصلهای مطلب
در مقاله قبلی خود پیاده سازی PCA در پایتون با Scikit-Learn، بررسی کردیم که چگونه می توانیم ابعاد مجموعه ویژگی ها را با استفاده از PCA کاهش دهیم. در این مقاله ما یکی دیگر از روش های بسیار مهم کاهش ابعاد را مطالعه خواهیم کرد: تجزیه و تحلیل تفکیک خطی (یا LDA). اما ابتدا اجازه دهید به طور خلاصه در مورد تفاوت PCA و LDA با یکدیگر بحث کنیم.
PCA در مقابل LDA: تفاوت چیست؟
هر دو PCA و LDA تکنیک های تبدیل خطی هستند. با این حال، PCA بدون نظارت است در حالی که LDA یک تکنیک کاهش ابعاد نظارت شده است.
PCA هیچ نگرانی با برچسب های کلاس ندارد. به عبارت ساده، PCA مجموعه ویژگی ها را بدون تکیه خلاصه می کند روی خروجی. PCA سعی می کند جهت حداکثر واریانس را در مجموعه داده پیدا کند. در یک مجموعه ویژگی های بزرگ، بسیاری از ویژگی ها وجود دارند که صرفاً تکراری از ویژگی های دیگر هستند یا با سایر ویژگی ها همبستگی بالایی دارند. چنین ویژگی هایی اساساً اضافی هستند و می توان آنها را نادیده گرفت. نقش PCA این است که چنین ویژگی های بسیار همبسته یا تکراری را پیدا کند و مجموعه ویژگی های جدیدی را ارائه کند که در آن حداقل همبستگی بین ویژگی ها یا به عبارت دیگر مجموعه ویژگی ها با حداکثر واریانس بین ویژگی ها وجود داشته باشد. از آنجایی که واریانس بین ویژگی ها به خروجی بستگی ندارد، بنابراین PCA برچسب های خروجی را در نظر نمی گیرد.
برخلاف PCA، LDA سعی می کند ابعاد مجموعه ویژگی را کاهش دهد و در عین حال اطلاعاتی را که کلاس های خروجی را متمایز می کند حفظ کند. LDA سعی می کند یک مرز تصمیم را در اطراف هر خوشه از یک کلاس پیدا کند. سپس نقاط داده را به ابعاد جدید به گونه ای طرح می کند که خوشه ها تا حد امکان از یکدیگر جدا باشند و عناصر منفرد در یک خوشه تا حد امکان به مرکز خوشه نزدیک شوند. ابعاد جدید رتبه بندی شده اند روی اساس توانایی آنها برای به حداکثر رساندن فاصله بین خوشه ها و به حداقل رساندن فاصله بین نقاط داده در یک خوشه و مرکز آنها. این ابعاد جدید متمایز کننده های خطی مجموعه ویژگی ها را تشکیل می دهند.
اکنون ببینیم چگونه می توانیم LDA را با استفاده از Scikit-Learn پایتون پیاده سازی کنیم.
پیاده سازی LDA با Scikit-Learn
مانند PCA، Scikit-Learn کتابخانه شامل کلاس های داخلی برای انجام LDA است روی مجموعه داده در این بخش LDA را اعمال خواهیم کرد روی مجموعه داده عنبیه چون ما از همان مجموعه داده برای مقاله PCA استفاده کردیم و می خواهیم نتایج LDA را با PCA مقایسه کنیم. اطلاعات مربوط به مجموعه داده Iris در لینک زیر موجود است:
https://archive.ics.uci.edu/ml/datasets/iris
بقیه بخشها از خط لوله یادگیری ماشین سنتی ما پیروی میکنند:
واردات کتابخانه ها
import numpy as np
import pandas as pd
وارد کردن مجموعه داده
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ('sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class')
dataset = pd.read_csv(url, names=names)
پیش پردازش داده ها
هنگامی که یک مجموعه داده در یک شی قاب داده پاندا بارگذاری می شود، اولین گام این است که مجموعه داده را به ویژگی ها و برچسب های مربوطه تقسیم کنید و سپس مجموعه داده حاصل را به مجموعه های آموزشی و آزمایشی تقسیم کنید. کد زیر داده ها را به برچسب ها و مجموعه ویژگی ها تقسیم می کند:
X = dataset.iloc(:, 0:4).values
y = dataset.iloc(:, 4).values
اسکریپت بالا چهار ستون اول مجموعه داده را اختصاص می دهد، یعنی ویژگی مجموعه را به X
متغیر در حالی که مقادیر ستون پنجم (برچسب ها) به y
متغیر.
کد زیر داده ها را به مجموعه های آموزشی و آزمایشی تقسیم می کند:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
مقیاس بندی ویژگی ها
همانطور که در مورد PCA بود، ما باید مقیاس ویژگی را برای LDA نیز انجام دهیم. برای این کار اسکریپت زیر را اجرا کنید:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
انجام LDA
برای انجام LDA با Scikit-Learn تنها به چهار خط کد نیاز دارد. این LinearDiscriminantAnalysis
کلاس از sklearn.discriminant_analysis
کتابخانه را می توان برای اجرای LDA در پایتون استفاده کرد. به اسکریپت زیر دقت کنید:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n_components=1)
X_train = lda.fit_transform(X_train, y_train)
X_test = lda.transform(X_test)
در اسکریپت بالا LinearDiscriminantAnalysis
کلاس به عنوان وارد می شود LDA
. مانند PCA، باید مقدار را برای the ارسال کنیم n_components
پارامتر LDA که به تعداد تفکیک کننده های خطی که می خواهیم بازیابی کنیم اشاره دارد. در این مورد ما تنظیم می کنیم n_components
به 1، زیرا ابتدا می خواهیم عملکرد طبقه بندی کننده خود را با یک تفکیک کننده خطی بررسی کنیم. در نهایت ما آن را اجرا می کنیم fit
و transform
روشهایی برای بازیابی متمایزکنندههای خطی
توجه کنید، در مورد LDA، transform
روش دو پارامتر می گیرد: the X_train
و y_train
. با این حال در مورد PCA، transform
روش فقط به یک پارامتر نیاز دارد X_train
. این نشان دهنده این واقعیت است که LDA برچسب های کلاس خروجی را در هنگام انتخاب متمایز کننده های خطی در نظر می گیرد، در حالی که PCA به برچسب های خروجی بستگی ندارد.
آموزش و پیش بینی
از آنجایی که میخواهیم عملکرد LDA را با یک متمایز خطی با عملکرد PCA با یک مؤلفه اصلی مقایسه کنیم، از همان طبقهبندیکننده جنگل تصادفی که برای ارزیابی عملکرد الگوریتمهای کاهشیافته با PCA استفاده کردیم، استفاده خواهیم کرد.
کد زیر را اجرا کنید:
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(max_depth=2, random_state=0)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
ارزیابی عملکرد
مثل همیشه، آخرین مرحله ارزیابی عملکرد الگوریتم با کمک ماتریس سردرگمی و یافتن دقت پیشبینی است. اسکریپت زیر را اجرا کنید:
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
cm = confusion_matrix(y_test, y_pred)
print(cm)
print('Accuracy' + str(accuracy_score(y_test, y_pred)))
خروجی اسکریپت بالا به شکل زیر است:
((11 0 0)
( 0 13 0)
( 0 0 6))
Accuracy 1.0
می بینید که با یک تفکیک خطی، الگوریتم به دقت 100% دست یافت که از دقت به دست آمده با یک جزء اصلی که 93.33% بود بیشتر است.
PCA در مقابل LDA: برای کاهش ابعاد چه چیزی را انتخاب کنیم؟
در مورد داده های توزیع شده یکنواخت، LDA تقریباً همیشه بهتر از PCA عمل می کند. با این حال، اگر داده ها بسیار کج هستند (به طور نامنظم توزیع شده اند) پس توصیه می شود از PCA استفاده کنید زیرا LDA می تواند به سمت طبقه اکثریت سوگیری کند.
در نهایت، سودمند است که PCA می تواند برای داده های برچسب دار و همچنین بدون برچسب اعمال شود زیرا به آن متکی نیست. روی برچسب های خروجی از سوی دیگر، LDA به کلاس های خروجی برای یافتن متمایزکننده های خطی نیاز دارد و از این رو به داده های برچسب دار نیاز دارد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-27 22:52:05