Derinlikte Lineer Regresyon (Bölüm 2)

Bu makalenin ilk bölümünde, doğrusal regresyon problemini resmi olarak tanımladık ve veri setinin yalnızca bir özellik içerdiği basit doğrusal regresyon problemlerinin nasıl çözüleceğini gösterdik. Makalenin ikinci bölümünde, veri setinin herhangi bir sayıda özellik içerebileceği çoklu doğrusal regresyon problemlerini tartışacağız.
Basit lineer regresyon için bulduğumuz kapalı-form çözümü önce herhangi bir sayıda özelliğe genelleştireceğiz. Daha sonra lineer regresyon problemlerini çözmek için gradyan inişe dayalı alternatif bir yaklaşım önereceğiz ve bu yaklaşımın artılarını ve eksilerini kapalı form çözümü kullanarak tartışacağız. Ek olarak, Scikit-Learn'de her iki yaklaşımı uygulayan sınıfları inceleyeceğiz ve bunların gerçek dünya veri setinde nasıl kullanılacağını göstereceğiz.
Çoklu Doğrusal Regresyon Tanımı
Regresyon problemlerinde bize n etiketli örnek verildiğini hatırlayın : D = {( x ₁, y ₁), ( x ₂, y ₂), … , ( x ₙ, yₙ )}, burada x ᵢ bir m'dir örnek i'nin özelliklerini içeren -boyutlu vektör ve yᵢ , o örneğin etiketini temsil eden gerçek bir değerdir .
Doğrusal regresyon problemlerinde , x özellik vektörü ile y etiketi arasında doğrusal bir ilişki olduğunu varsayarız , dolayısıyla model hipotezimiz aşağıdaki formu alır:

Amacımız , kare artıkların toplamını en aza indirecek bu modelin w parametrelerini bulmaktır :

Makalenin önceki bölümünde, normal denklemleri kullanarak m = 1 durumu için en uygun w'nin nasıl bulunacağını göstermiştik . Şimdi bu denklemleri herhangi bir sayıda özellik için genişleteceğiz m .
Genel durum için normal denklemlerin türetilmesini basitleştirmek için, önce kesişme terimleri de dahil olmak üzere veri kümesindeki tüm özelliklerin değerlerini içeren bir X matrisi tanımlarız :

Bu matrise tasarım matrisi denir . Tasarım matrisindeki her satır ayrı bir örneği temsil eder ve sütunlar açıklayıcı değişkenleri temsil eder. Matrisin boyutları n × ( m + 1) olup, burada n örnek sayısı ve m özellik sayısıdır.
Ek olarak, y vektörünü tüm hedef değerleri içeren n boyutlu bir vektör olarak tanımlarız :

Bu tanımlar, sıradan en küçük kareler (OLS) maliyet fonksiyonunu aşağıdaki matris biçiminde yazmamıza izin verir:

Kanıt :
Öncelikle şunu not ediyoruz:

Bir vektörün kendisi u ᵗ u ile iç çarpımı , tüm bileşenlerinin karesinin toplamıdır, dolayısıyla elimizde:

Kapalı Form Çözümü
Basit lineer regresyonda olduğu gibi, J ( w ) fonksiyonu dışbükeydir, dolayısıyla tek bir yerel minimuma sahiptir, bu aynı zamanda genel minimumdur. Bu global minimumu bulmak için, J'nin ( w ) gradyanını w'ye göre hesaplayıp sıfıra ayarladık.
J'nin ( w ) w'ye göre gradyanı şu şekildedir:

Bu ispat sırasında, bu makalede açıklanan bazı temel matris hesabı kurallarını kullandık:
Matris Hesabına Nazik Bir GirişŞimdi normal denklemleri elde etmek için bu gradyanı sıfıra ayarladık:

Bu nedenle, en küçük kareler maliyet fonksiyonunu en aza indiren optimal w* şöyledir:

Burada X'in sütunlarının lineer olarak bağımsız olduğunu (yani, X'in tam bir sütun rankına sahip olduğunu ) varsaydığımıza dikkat edin , aksi halde XᵗX tersinmez ve w * için benzersiz bir çözüm yoktur.
X'in sütunları doğrusal olarak bağımlı olduğunda , bu olguya çoklu doğrusal bağlantı diyoruz . Matematiksel olarak, tüm örnekler i için ise, bir değişkenler kümesi mükemmel şekilde çoklu bağlantıdır :

burada λₖ sabittir ve xᵢₖ , örnek i'deki k özelliğinin değeridir .
Uygulamada, mükemmel çoklu bağlantı nadirdir (örneğin, verilerde yanlışlıkla bir değişkenin kopyalanmasından kaynaklanabilir). Bununla birlikte, iki veya daha fazla özelliğin birbiriyle yüksek oranda ilişkili olduğu (ancak tam olarak ilişkili olmadığı) daha düşük çoklu bağlantı dereceleri bile, hem modeli uydururken (katsayılar verilerdeki küçük değişikliklere karşı çok hassas hale gelir) hem de yorumlarken sorunlara neden olabilir. sonuçlar (hangi özelliklerin modelin tahminleri üzerinde en fazla etkiye sahip olduğunu belirlemek zorlaşır).
İlgilenen okuyucu çoklu bağlantı sorunu ve bununla nasıl başa çıkılacağı hakkında daha fazla bilgiyi bu Wikipedia makalesinde bulabilir .
Çoklu Doğrusal Regresyon Örneği
Kapalı form çözümünün kullanımını göstermek için, California konut veri kümesi için sklearn.datasets modülünde bulunan bir doğrusal regresyon modeli oluşturalım . Bu veri setindeki amaç, California'daki belirli bir bölgenin (ev bloğu) medyan ev değerini, o bölgenin medyan geliri veya hane başına düşen ortalama oda sayısı gibi 8 farklı özelliğini temel alarak tahmin etmektir.
İlk önce gerekli kitaplıkları içe aktarırız ve tekrarlanabilir sonuçlar elde etmek için rastgele çekirdeği başlatırız:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(0)
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()
X, y = data.data, data.target
feature_names = data.feature_names
mat = np.column_stack((X, y))
df = pd.DataFrame(mat, columns=np.append(feature_names, 'MedianValue'))
df.head()
The first five rows from the California housing dataset
df.info()
Şimdi verileri %80 eğitim seti ve %20 test seti olarak ayırdık:
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)
def closed_form_solution(X, y):
w = np.linalg.inv(X.T @ X) @ X.T @ y
return w
En uygun w'yi bulmak için bu işlevi kullanmadan önce , kesme terimini temsil etmek için X_train matrisine 1'lerden oluşan bir sütun eklememiz gerekir . Bu, np.column_stack () işleviyle kolayca yapılabilir :
X_train_b = np.column_stack((np.ones(len(X_train)), X_train))
w = closed_form_solution(X_train_b, y_train)
w
array([-3.68585691e+01, 4.33333407e-01, 9.29324337e-03, -9.86433739e-02,
5.93215487e-01, -7.56192502e-06, -4.74516383e-03, -4.21449336e-01,
-4.34166041e-01])
Şimdi modeli eğitim ve test setleri üzerinde değerlendirelim. Modelinizi her ikisinde de değerlendirmek önemlidir, çünkü eğitim ve test puanları arasındaki büyük bir tutarsızlık, modelinizin fazla uyumlu olduğunu gösterebilir.
Eğitim seti üzerinde R² skorunu bularak başlıyoruz . Bu amaçla, önce X_train_b matrisini w vektörü ile çarparak modelin eğitim örnekleri üzerindeki tahminlerini elde ederiz :
y_train_pred = X_train_b @ w
from sklearn.metrics import r2_score
train_score = r2_score(y_train, y_train_pred)
print(f'R2 score (train): {train_score:.5f}')
R2 score (train): 0.60890
X_test_b = np.column_stack((np.ones(len(X_test)), X_test))
y_test_pred = X_test_b @ w
test_score = r2_score(y_test, y_test_pred)
print(f'R2 score (test): {test_score:.5f}')
R2 score (test): 0.59432
Egzersiz yapmak
Diyelim ki veri setindeki her noktayı yanlışlıkla kopyaladık ve sonra tekrar lineer regresyon yaptık. Bu, modelin ağırlıklarını nasıl etkileyecek?
İpucu : X tasarım matrisine ve y etiket vektörüne ne olacağını ve bu değişikliklerin normal denklemleri nasıl etkileyeceğini düşünün.
Çözüm bu makalenin sonunda bulunabilir.
Scikit-Learn'de Lineer Regresyon
Scikit-Learn , sıradan en küçük kareler problemine kapalı biçimli çözümü de uygulayan LinearRegression adlı bir sınıf sağlar .
Varsayılan olarak, bu sınıf tasarım matrisine otomatik olarak 1'lerden oluşan bir sütun ekler, bu nedenle daha önce yaptığımız gibi manuel olarak eklemeniz gerekmez (kurucuda fit_intercept parametresini False olarak ayarlamadıysanız ) .
Bir regresyon modelini aynı veri kümesine sığdırmak için bu sınıfı kullanalım:
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)
- coef_ , kesme hariç tüm ağırlıkları içeren bir dizidir.
- kesme_ kesme terimidir ( w ₀)
print(reg.intercept_)
print(reg.coef_)
-36.858569106801234
[ 4.33333407e-01 9.29324337e-03 -9.86433739e-02 5.93215487e-01
-7.56192502e-06 -4.74516383e-03 -4.21449336e-01 -4.34166041e-01]
Bu sınıfın Score() yöntemi, modelin R² puanını döndürür . Yalnızca puan almak istediğiniz veri kümesinin X matrisini ve y vektörünü gerektirir (bu nedenle modelin tahminlerini hesaplamanıza gerek yoktur). Örneğin eğitim ve test setlerinde R² puanını şu şekilde alabiliriz :
train_score = reg.score(X_train, y_train)
print(f'R2 score (train): {train_score:.5f}')
test_score = reg.score(X_test, y_test)
print(f'R2 score (test): {test_score:.5f}')
R2 score (train): 0.60890
R2 score (test): 0.59432
Regresyon Hatalarını Analiz Etme
Modelin genel performansını değerlendirmeye ek olarak, genellikle regresyon hatalarımızın davranışını araştırmak isteriz. Örneğin, hatalar normalde 0 civarında mı dağılıyor yoksa çarpık mı? Modelimizin özellikle yüksek tahmin hatalarına sahip olduğu girdiler var mı?
Bu soruların cevapları, bu hataların kaynağını bulmamıza yardımcı olacaktır. Örneğin, hataların 0 civarında normal dağılmaması, doğrusal regresyon modelinin veri setimize uygun olmadığını ve diğer regresyon modellerini (örneğin, polinom regresyon) denememiz gerektiğini gösterebilir. Veya, modelimizin bazı örneklerde özellikle yüksek tahmin hataları varsa, bunlar aykırı değerler olabilir ve nereden geldiklerini araştırmamız gerekir.
Bu soruları yanıtlamanıza yardımcı olabilecek bir çizime artıklar grafiği denir . Bu çizim, y eksenindeki kalıntıları ve x eksenindeki modelin tahmin edilen değerlerini gösterir .
Bu grafiği oluşturmak için bir fonksiyon yazalım:
def plot_residuals(y_train_pred, y_train, y_test_pred, y_test):
plt.scatter(y_train_pred, y_train_pred - y_train, s=2, marker='o', c='b', label='Training')
plt.scatter(y_test_pred, y_test_pred - y_test, s=2, marker='s', c='m', label='Test')
xmin = min(y_train_pred.min(), y_test_pred.min())
xmax = max(y_train_pred.max(), y_test_pred.max())
plt.hlines(y=0, xmin=xmin, xmax=xmax, color='black')
plt.xlim(xmin, xmax)
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend()
plot_residuals(y_train_pred, y_train, y_test_pred, y_test)
Egzersiz yapmak
Kaggle'dan Öğrenci İşaretleri veri kümesini indirin . Bir öğrencinin çalışma süresine ve aldığı ders sayısına dayalı olarak notunu tahmin etmek için doğrusal bir regresyon modeli oluşturun. Hem eğitim hem de test setlerinde modelin RMSE ve R ² puanını hesaplayın. Artıkları tahmin edilen değerlere karşı çizin. Veri setindeki bu çizimden ne öğrenebilirsiniz?
Dereceli alçalma
Kapalı form çözümü bize regresyon modelinin en uygun parametrelerini bulmamız için doğrudan bir yol sunsa da, birkaç dezavantajı vardır:
- Kapalı form çözümü, çok sayıda özelliğe sahip olduğumuzda hesaplama açısından verimsizdir, çünkü bir m × m matrisi olan XᵗX'in tersinin hesaplanmasını gerektirir ( m , özellik sayısıdır). Bir matrisin tersinin hesaplanması, çoğu uygulamada O ( m ³) çalışma zamanı karmaşıklığına sahiptir.
- X tasarım matrisinin tamamının bellekte olması gerekir ki bu, çok büyük bir veri kümemiz varsa her zaman mümkün olmayabilir.
- X tasarım matrisindeki herhangi bir değişiklik, XᵗX'in tersinin yeniden hesaplanmasını gerektirdiğinden çevrimiçi (artımlı) öğrenmeyi desteklemez .

En küçük kareler maliyetinin minimumunu bulmak için gradyan inişini kullanmak için, ağırlıkların her birine göre J ( w ) 'nin kısmi türevlerini hesaplamamız gerekir .
J ( w )'nin wⱼ ağırlıklarından herhangi birine göre kısmi türevi :

Bu nedenle, gradyan iniş güncelleme kuralı şöyledir:

α, adım boyutunu kontrol eden bir öğrenme oranıdır (0 < α < 1).
w'nin her bir bileşenini ayrı ayrı güncellemek yerine , w vektörünün tamamını tek adımda güncelleyebiliriz :

Gradyan iniş aşağıdaki modlardan birinde uygulanabilir:
- Toplu gradyan iniş — biz tüm eğitim setindeki hatayı hesapladıktan sonra ağırlıklar güncellenir.
- Stokastik gradyan iniş (SGD) — her eğitim örneğinden sonra bir gradyan iniş adımı gerçekleştirilir. Bu durumda, gradyan iniş güncelleme kuralı aşağıdaki formu alır:

Gradyan inişini her kullandığınızda, veri kümenizin normalleştirildiğinden emin olmanız gerektiğini unutmayın (aksi takdirde degrade iniş, farklı yönlerde farklı boyutlarda adımlar atabilir ve bu da onu kararsız hale getirir).
SGDRegressor Sınıfı
Scikit-Learn'deki SGDRegressor sınıfı, doğrusal bir regresyon modeli uydurmak için SGD yaklaşımını uygular. Spesifik regresyon modeli türü, kayıp parametresi tarafından belirlenir . Varsayılan olarak değeri ' squared_error ' şeklindedir, bu da sıradan bir en küçük kareler modeline uyması anlamına gelir. Diğer seçenekler, gelecek makalelerde ele alınacak olan ' huber ' ve ' epsilon_inresponsive ' (Destek Vektörü Gerilemesinde kullanılan kayıp işlevi) içerir.
Loss işlevine ek olarak, bu sınıfın yapıcısının birkaç önemli parametresi daha vardır:
- ceza — kullanılacak düzenleme türü (varsayılanı 'l2'dir).
- alfa — normalleştirme katsayısı (varsayılanı 0,0001'dir).
- max_iter — eğitim verileri üzerindeki maksimum dönem sayısı (varsayılanı 1000'dir).
- learning_rat e — ağırlık güncellemeleri için öğrenme oranı çizelgesi (varsayılanı 'invscaling' şeklindedir).
- eta0 — kullanılan ilk öğrenme oranı (varsayılanı 0,01'dir).
- Early_stopping — doğrulama puanı gelişmediğinde eğitimin durdurulup durdurulmayacağı (varsayılanı False'dir).
- validation_fraction — eğitim setinin doğrulama için ayrılacak oranı (varsayılanı 0,1'dir).
- Ortalamayı kaldırarak ve bunları birim varyansa göre ölçeklendirerek özellikleri normalleştiren bir StandardScaler .
- Varsayılan ayarları olan bir SGDRegressor.
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()),
('reg', SGDRegressor())
])
pipeline.fit(X_train, y_train)
train_score = pipeline.score(X_train, y_train)
print(f'R2 score (train): {train_score:.5f}')
test_score = pipeline.score(X_test, y_test)
print(f'R2 score (test): {test_score:.5f}')
R2 score (train): -485.79460
R2 score (test): -4485.30424

SGDRegressor'ın eta0 parametresini değiştirerek öğrenme oranını 0,01'den 0,001'e düşürelim :
pipeline.set_params(reg__eta0=0.001)
pipeline.fit(X_train, y_train)
train_score = pipeline.score(X_train, y_train)
print(f'R2 score (train): {train_score:.5f}')
test_score = pipeline.score(X_test, y_test)
print(f'R2 score (test): {test_score:.5f}')
R2 score (train): 0.60188
R2 score (test): 0.58393
Temel Çıkarımlar
- Doğrusal regresyonda, bir dizi özellik ile bir hedef değişken arasında doğrusal bir ilişki bulmaya çalışıyoruz.
- Anahtar varsayımlar, özelliklerin doğrusal olarak bağımsız olduğu ve hata terimlerinin birbirinden bağımsız olduğu ve sıfır ortalama ile normal olarak dağıldığıdır.
- Olağan en küçük kareler (OLS) regresyonunda kare artıkların toplamını en aza indirmeye çalışırız. OLS'nin maliyet fonksiyonu dışbükeydir, dolayısıyla tek bir minimum noktası vardır.
- Modelin optimal parametrelerini bulmak için iki ana yaklaşım, kapalı form çözümü ve gradyan inişidir. Veri kümesi büyük olduğunda veya çevrimiçi öğrenmeyi desteklememiz gerektiğinde gradyan iniş tercih edilir.
- Gradyan inişini kullanırken, özelliklerinizi normalleştirmeniz ve uygun bir öğrenme oranı seçmeniz önemlidir.
- Regresyon modellerinin performansını , 0 ile 1 arasında değişen ve modelin her zaman hedefin ortalamasını tahmin eden temel modelden ne kadar iyi olduğunu ölçen R² skoru ve ortalama karenin karekökü olan RMSE kullanarak değerlendiriyoruz. hatalar.
Kapalı form çözümünün şu olduğunu hatırlayın:

Veri noktalarını ikiye katlarsak, X ve y yerine aşağıdaki tasarım matrisine ve hedef vektöre sahip oluruz:

A matrisinin 2 n satırı ve m sütunu vardır, burada matrisin 1, …, n satırları n + 1, …, 2 n satırlarıyla aynıdır . Benzer şekilde, z vektörü 2 n satıra sahiptir, burada ilk n satır son n satırla aynıdır .
bunu kolayca gösterebiliriz

Kanıt :

Benzer şekilde, ( z'yi tek sütunlu bir matris olarak ele alabiliriz ):

Bu nedenle şunları yazabiliriz:

Orijinal modeldeki ile aynı ağırlıkları alıyoruz! yani, regresyon modeli değişmeyecektir.
Son Notlar
Aksi belirtilmedikçe tüm resimler yazara aittir.
Bu makalenin kod örneklerini github'umda bulabilirsiniz:https://github.com/roiyeho/medium/tree/main/multiple_linear_regression
Okuduğunuz için teşekkürler!