Bu eğitimde, verileri nasıl kontrol edeceğinizi ve basit bir doğrusal regresyon görevi oluşturmak için nasıl hazırlayacağınızı öğreneceksiniz.
Bu eğitim iki bölüme ayrılmıştır:
- Etkileşim arayın
- Modeli test edin
Önceki eğiticide, bir evin ortalama fiyatını tahmin etmek için Boston veri kümesini kullandınız. Boston veri kümesi, yalnızca 506 gözlemle küçük bir boyuta sahiptir. Bu veri kümesi, yeni doğrusal regresyon algoritmalarını denemek için bir kriter olarak kabul edilir.
Veri kümesi şunlardan oluşur:
Değişken | Açıklama |
zn | 25.000 sq.ft.'nin üzerindeki arsalar için imar edilmiş konut arazisinin oranı. |
Endüstri | Şehir başına perakende dışı işletme akrının oranı. |
nox | nitrik oksit konsantrasyonu |
rm | konut başına ortalama oda sayısı |
yaş | 1940'tan önce inşa edilen, sahibi tarafından kullanılan birimlerin oranı |
dis | Beş Boston istihdam merkezine ağırlıklı mesafeler |
vergi | 10.000 dolar başına tam değer emlak vergisi oranı |
ptratio | bir kasabaya göre öğrenci-öğretmen oranı |
medv | Sahibi tarafından kullanılan evlerin bin dolar cinsinden medyan değeri |
suç | şehre göre kişi başına suç oranı |
chas | Charles River kukla değişkeni (nehri sınırlarsa 1; aksi halde 0) |
B | Kasabaya göre siyahların oranı |
Bu eğiticide, ortalama fiyatı doğrusal bir regresör kullanarak tahmin edeceğiz, ancak odak noktası makine öğreniminin belirli bir sürecidir: "veri hazırlama".
Bir model, verilerdeki örüntüyü genelleştirir. Böyle bir kalıbı yakalamak için önce onu bulmanız gerekir. Herhangi bir makine öğrenimi algoritmasını çalıştırmadan önce veri analizi yapmak iyi bir uygulamadır.
Doğru özellikleri seçmek, modelinizin başarısındaki tüm farkı yaratır. Bir insanın ücretini tahmin etmeye çalıştığınızı hayal edin, eğer cinsiyeti bir ortak değişken olarak dahil etmezseniz, kötü bir tahminde bulunursunuz.
Modeli geliştirmenin bir başka yolu da bağımsız değişken arasındaki ilişkiye bakmaktır. Örneğe dönersek, eğitimi ücreti ve mesleği tahmin etmek için mükemmel bir aday olarak düşünebilirsiniz. Mesleğin eğitim seviyesine bağlı olduğunu söylemek doğru olur, yani yüksek öğrenim genellikle daha iyi bir mesleğe yol açar. Bu fikri genellersek, bağımlı değişken ile açıklayıcı bir değişken arasındaki korelasyonun başka bir açıklayıcı değişkenden büyütülebileceğini söyleyebiliriz.
Eğitimin meslek üzerindeki sınırlı etkisini yakalamak için bir etkileşim terimi kullanabiliriz.
Ücret denklemine bakarsanız, şu olur:
Eğer olumlu, o zaman eğitim ek bir seviye yüksek meslek seviyesi için bir evin ortanca değerinden daha yüksek bir artışa sebebiyet verir anlamına gelir. Diğer bir deyişle, eğitim ve meslek arasında bir etkileşim etkisi vardır.
Bu eğitimde, hangi değişkenlerin etkileşim terimleri için iyi bir aday olabileceğini görmeye çalışacağız. Bu tür bilgilerin eklenmesinin daha iyi fiyat tahminine yol açıp açmadığını test edeceğiz.
Bu eğitimde öğreneceksiniz
- Özet istatistikler
- Özelliklere Genel Bakış
- Özellikler Ayrıntılı İnceleme
- Façeta Yükle
- Genel Bakış
- Grafik
- Özellikler Ayrıntılı İnceleme
- TensorFlow
- Hazırlık verileri
- Temel regresyon: Kıyaslama
- Modeli geliştirin: Etkileşim terimi
Özet istatistikler
Modele geçmeden önce izleyebileceğiniz birkaç adım var. Daha önce de belirtildiği gibi, model verilerin bir genellemesidir. En uygun uygulama, verileri anlamak ve bir tahminde bulunmaktır. Verilerinizi bilmiyorsanız, modelinizi geliştirme şansınız düşüktür.
İlk adım olarak, verileri pandalar veri çerçevesi olarak yükleyin ve bir eğitim seti ve test seti oluşturun.
İpuçları: Bu eğitim için Python'da matplotlit ve seaborn yüklü olmalıdır. Python paketini Jupyter ile anında kurabilirsiniz. Sen olmamalı Bunu yapmak
!conda install -- yes matplotlib
fakat
import sys!{sys.executable} -m pip install matplotlib # Already installed!{sys.executable} -m pip install seaborn
Matplotlib ve seaborn kurulu ise bu adımın gerekli olmadığını unutmayın.
Matplotlib, Python'da bir grafik oluşturmak için kullanılan kütüphanedir. Seaborn, matplotlib üzerine inşa edilmiş bir istatistiksel görselleştirme kütüphanesidir. Çekici ve güzel araziler sağlar.
Aşağıdaki kod, gerekli kitaplıkları içe aktarır.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np
Kütüphane sklearn, Boston veri setini içerir. Verileri içe aktarmak için API'sini çağırabilirsiniz.
boston = load_boston()df = pd.DataFrame(boston.data)
Özelliğin adı, bir dizideki nesne özellik adlarında saklanır.
boston.feature_names
Çıktı
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='Sütunları yeniden adlandırabilirsiniz.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)CHAS değişkenini bir dize değişkeni olarak dönüştürür ve CHAS = 1 ise evet ve CHAS = 0 ise hayır olarak etiketleyin.
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectPandalar söz konusu olduğunda, veri kümesini bölmek kolaydır. Veri kümesini yüzde 80 eğitim seti ve yüzde 20 test seti ile rastgele bölersiniz. Pandalar, bir veri çerçevesi örneğini bölmek için yerleşik bir maliyet işlevine sahiptir.
İlk parametre frac, 0 ile 1 arasında bir değerdir. Veri çerçevesinin rastgele yüzde 80'ini seçmek için bunu 0,8'e ayarlarsınız.
Random_state, herkes için aynı veri çerçevesinin döndürülmesine izin verir.
### Create train/test setdf_train=df.sample(frac=0.8,random_state=200)df_test=df.drop(df_train.index)Verilerin şeklini alabilirsiniz. Olmalı:
- Tren seti: 506 * 0.8 = 405
- Test seti: 506 * 0.2 = 101
print(df_train.shape, df_test.shape)Çıktı
(405, 14) (101, 14)df_test.head(5)Çıktı
CRIM ZN ENDÜSTRİ CHAS NOX RM YAŞ DIS RAD VERGİ PTRATYO B LSTAT FİYAT 0 0.00632 18.0 2.31 Hayır 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0 1 0,02731 0.0 7.07 Hayır 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6 3 0,03237 0.0 2.18 Hayır 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4 6 0.08829 12.5 7.87 Hayır 0.524 6.012 66.6 5.5605 5.0 311.0 15.2 395,60 12.43 22.9 7 0,14455 12.5 7.87 Hayır 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1 Veriler dağınık; genellikle dengesizdir ve analiz ve makine öğrenimi eğitimini boşa çıkaran aykırı değerler serpilir.
Veri kümesini temizlemenin ilk adımı, nerede temizlenmesi gerektiğini anlamaktır. Bir veri kümesini temizlemek, özellikle genelleştirilebilir herhangi bir şekilde yapmak zor olabilir
Google Araştırma ekibi, Facets adlı bu iş için verileri görselleştirmeye ve her türlü şekilde dilimlemeye yardımcı olan bir araç geliştirdi . Bu, veri kümesinin nasıl yerleştirildiğini anlamak için iyi bir başlangıç noktasıdır.
Özellikler, verilerin tam olarak sizin düşündüğünüz gibi görünmediğini bulmanızı sağlar.
Web uygulamaları dışında Google, araç setini bir Jupyter not defterine yerleştirmeyi kolaylaştırır.
Fasetlerin iki bölümü vardır:
- Özelliklere Genel Bakış
- Özellikler Ayrıntılı İnceleme
Özelliklere Genel Bakış
Facets Overview, veri kümesine genel bir bakış sağlar. Özelliklere Genel Bakış, verilerin sütunlarını dikkat çekici bilgi satırlarına böler.
- eksik gözlem yüzdesi
- minimum ve maksimum değerler
- ortalama, medyan ve standart sapma gibi istatistikler.
- Ayrıca, sıfır olan değerlerin yüzdesini gösteren bir sütun ekler ve bu, değerlerin çoğu sıfır olduğunda yararlıdır.
- Bu dağılımları test veri setinde ve her özellik için eğitim setinde görmek mümkündür. Bu, testin eğitim verilerine benzer bir dağılıma sahip olup olmadığını iki kez kontrol edebileceğiniz anlamına gelir.
Bu, en azından herhangi bir makine öğrenimi görevinden önce yapılması gereken minimum şeydir. Bu araçla, bu önemli adımı kaçırmazsınız ve bazı anormallikleri vurgular.
Özellikler Ayrıntılı İnceleme
Facets Deep Dive harika bir araçtır. Veri kümenizde biraz netliğe sahip olmanıza ve tek bir veri parçasını görmek için sonuna kadar yakınlaştırmanıza olanak tanır. Bu, verileri veri kümesinin herhangi bir özelliği boyunca satır ve sütuna göre ayarlayabileceğiniz anlamına gelir.
Bu iki aracı Boston veri kümesiyle kullanacağız.
Not : Facets Overview ve Facets Deep Dive'ı aynı anda kullanamazsınız. Aracı değiştirmek için önce not defterini temizlemeniz gerekir.
Façeta Yükle
Analizin çoğu için Facet web uygulamasını kullanabilirsiniz. Bu eğitimde, bir Jupyter Not Defterinde nasıl kullanılacağını göreceksiniz.
Öncelikle nbextensions kurmanız gerekir. Bu kod ile yapılır. Aşağıdaki kodu kopyalayıp makinenizin terminaline yapıştırıyorsunuz.
pip install jupyter_contrib_nbextensionsBundan hemen sonra, bilgisayarınızdaki depoları klonlamanız gerekir. İki seçeneğiniz var:
Seçenek 1) Bu kodu kopyalayıp terminale yapıştırın (Önerilen)
Makinenizde Git kurulu değilse, lütfen bu URL'ye https://git-scm.com/download/win gidin ve talimatları izleyin. İşiniz bittiğinde, Mac Kullanıcısı için terminaldeki git komutunu veya Windows kullanıcısı için Anaconda komut istemini kullanabilirsiniz.
git clone https://github.com/PAIR-code/facetsSeçenek 2) https://github.com/PAIR-code/facets adresine gidin ve depoları indirin.
İlk seçeneği seçerseniz, dosya indirme dosyanızda biter. Dosyanın indirilmesine izin verebilir veya başka bir yola sürükleyebilirsiniz.
Bu komut satırı ile Facets'in nerede depolandığını kontrol edebilirsiniz:
echo `pwd`/`ls facets`Artık Facets'i bulduğunuza göre, onu Jupyter Notebook'a yüklemeniz gerekir. Çalışma dizinini fasetlerin bulunduğu yola ayarlamanız gerekir.
Mevcut çalışma dizininiz ve Facets zip konumunuz aynı olmalıdır.
Çalışma dizinini Facet'e yönlendirmeniz gerekir:
cd facetsFacets'i Jupyter'e yüklemek için iki seçeneğiniz vardır. Jupyter'i tüm kullanıcılar için Conda ile kurduysanız, bu kodu kopyalayın:
jupyter nbextension kurulumunu kullanabilir facets-dist /
jupyter nbextension install facets-dist/Aksi takdirde, şunu kullanın:
jupyter nbextension install facets-dist/ --userPekala, hazırsınız. Facet Overview'ı açalım.
Genel Bakış
Genel bakış, istatistikleri hesaplamak için bir Python betiği kullanır. Generic_feature_statistics_generator adlı komut dosyasını Jupyter'e aktarmanız gerekir. Merak etmeyin; komut dosyası, faset dosyalarında bulunur.
Yolunu bulmanız gerekiyor. Kolayca yapılır. Fasetleri açarsınız, facets_overview dosyasını ve ardından python'u açarsınız. Yolu kopyalayın
Bundan sonra Jupyter'e geri dönün ve aşağıdaki kodu yazın. '/ Users / Thomas / facets / facets_overview / python' yolunu kendi yolunuza değiştirin.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Komut dosyasını aşağıdaki kodla içe aktarabilirsiniz.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorPencerelerde aynı kod olur
import syssys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorÖzellik istatistiklerini hesaplamak için, GenericFeatureStatisticsGenerator () işlevini kullanmanız ve ProtoFromDataFrames nesnesini kullanmanız gerekir. Veri çerçevesini bir sözlükte aktarabilirsiniz. Örneğin, tren seti için bir özet istatistik oluşturmak istersek, bilgiyi bir sözlükte saklayabilir ve `` ProtoFromDataFrames '' nesnesinde kullanabiliriz.
'name': 'train', 'table': df_trainAd, görüntülenen tablonun adıdır ve özeti hesaplamak istediğiniz tablonun adını kullanırsınız. Örneğinizde, verileri içeren tablo df_train
# Calculate the feature statistics proto from the datasets and stringify it for use in facets overviewimport base64gfsg = GenericFeatureStatisticsGenerator()proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},{'name': 'test', 'table': df_test}])#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")Son olarak, aşağıdaki kodu kopyalayıp yapıştırmanız yeterlidir. Kod doğrudan GitHub'dan gelir. Bunu görebilmelisin:
# Display the facets overview visualization for this data# Displfrom IPython.core.display import display, HTMLHTML_TEMPLATE = """"""html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html)) Grafik
Verileri ve dağılımlarını kontrol ettikten sonra, bir korelasyon matrisi çizebilirsiniz. Korelasyon matrisi, Pearson katsayısını hesaplar. Bu katsayı -1 ile 1 arasında bağlanır, pozitif bir değer pozitif bir korelasyonu ve negatif bir değer ise negatif bir korelasyonu gösterir.
Hangi değişkenlerin etkileşim terimleri için iyi bir aday olabileceğini görmekle ilgileniyorsunuz.
## Choose important feature and further check with Dive%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="ticks")# Compute the correlation matrixcorr = df.corr('pearson')# Generate a mask for the upper trianglemask = np.zeros_like(corr, dtype=np.bool)mask[np.triu_indices_from(mask)] = True# Set up the matplotlib figuref, ax = plt.subplots(figsize=(11, 9))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,square=True, linewidths=.5, cbar_kws={"shrink": .5})Çıktı
png
Matristen şunları görebilirsiniz:
- LSTAT
- RM
PRICE ile güçlü bir şekilde ilişkilidir. Bir başka heyecan verici özellik, NOX ve INDUS arasındaki güçlü pozitif korelasyondur, bu da bu iki değişkenin aynı yönde hareket ettiği anlamına gelir. Bunun yanı sıra, PRICE ile de korelasyon vardır. DIS ayrıca IND ve NOX ile de oldukça ilişkilidir.
IND ve NOX'in kesişme terimi için iyi adaylar olabileceğine ve DIS'e odaklanmanın ilginç olabileceğine dair bazı ilk ipuçlarınız var.
Bir çift ızgara çizerek biraz daha derine inebilirsiniz. Daha önce çizdiğiniz korelasyon haritasını daha ayrıntılı olarak gösterecektir.
Oluşturduğumuz çift ızgara aşağıdaki gibidir:
- Üst kısım: Bağlı çizgi ile dağılım grafiği
- Köşegen: Çekirdek yoğunluğu grafiği
- Alt kısım: Çok değişkenli çekirdek yoğunluğu grafiği
Dört bağımsız değişkene odaklanmayı seçersiniz. Seçim, PRICE ile güçlü korelasyona sahip değişkenlere karşılık gelir
- ENDÜSTRİ
- NOX
- RM
- LSTAT
dahası, PRICE.
Not standart hata dağılım grafiği varsayılan olarak eklenir söyledi.
attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"]g = sns.PairGrid(df[attributes])g = g.map_upper(sns.regplot, color="g")g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False)g = g.map_diag(sns.kdeplot)Çıktı
Üst kısımdan başlayalım:
- Fiyat, INDUS, NOX ve LSTAT ile ters orantılıdır; RM ile pozitif korelasyon gösterdi.
- LSTAT ve PRICE ile biraz doğrusal olmayan bir durum var
- Fiyat 50'ye eşit olduğunda düz bir çizgi gibidir. Veri setinin açıklamasından, PRICE 50 değerinde kesilmiştir.
Diyagonal
- NOX, biri 0.5 ve diğeri 0.85 civarında olmak üzere iki kümeye sahip görünüyor.
Daha fazlasını kontrol etmek için alt kısma bakabilirsiniz. Çok Değişkenli Çekirdek Yoğunluğu, noktaların çoğunun olduğu yeri renklendirmesi açısından ilginçtir. Dağılım grafiğiyle olan fark, belirli bir koordinat için veri kümesinde nokta olmamasına rağmen bir olasılık yoğunluğu çizer. Renk daha güçlü olduğunda, bu alan etrafında yüksek bir nokta konsantrasyonu olduğunu gösterir.
INDUS ve NOX için çok değişkenli yoğunluğu kontrol ederseniz, pozitif korelasyonu ve iki kümeyi görebilirsiniz. Sanayinin payı 18'in üzerinde olduğunda nitrik oksit konsantrasyonu 0,6'nın üzerindedir.
Doğrusal ilişkide INDUS ve NOX arasında bir etkileşim eklemeyi düşünebilirsiniz.
Son olarak, Google tarafından oluşturulan ikinci araçları, Facets Deep Dive'ı kullanabilirsiniz. Arayüz dört ana bölüme ayrılmıştır. Merkezdeki merkezi alan, verilerin yakınlaştırılabilir bir görüntüsüdür. Panelin üst kısmında, verilerin düzenini, fasetleme, konumlandırma ve rengi kontrol edecek şekilde değiştirebileceğiniz açılır menü vardır. Sağda, belirli bir veri satırının ayrıntılı bir görünümü var. Bu, belirli bir veri noktası hakkındaki ayrıntıları görmek için merkez görselleştirmedeki herhangi bir veri noktasına tıklayabileceğiniz anlamına gelir.
Veri görselleştirme adımı sırasında, evin fiyatı üzerindeki bağımsız değişken arasındaki ikili korelasyonu aramakla ilgileniyorsunuz. Bununla birlikte, en az üç değişken içerir ve 3B çizimlerle çalışmak karmaşıktır.
Bu sorunu çözmenin bir yolu, kategorik bir değişken yaratmaktır. Yani, 2 boyutlu bir nokta bir renk çizimi oluşturabiliriz. PRICE değişkenini dört kategoriye bölebilirsiniz; her kategori dörtte birdir (ör. 0,25, 0,5, 0,75). Bu yeni değişkeni Q_PRICE olarak adlandırıyorsunuz.
## Check non linearity with important featuresdf['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])## Show non linearity between RM and LSTATax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")Özellikler Ayrıntılı İnceleme
Deep Dive'ı açmak için verileri json formatına dönüştürmeniz gerekir. Bunun için bir nesne olarak pandalar. Pandas veri kümesinden sonra to_json kullanabilirsiniz.
İlk kod satırı, veri kümesinin boyutunu ele alır.
df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])sprite_size = 32 if len(df.index)>50000 else 64jsonstr = df.to_json(orient='records')Aşağıdaki kod Google GitHub'dan geliyor. Kodu çalıştırdıktan sonra şunu görebilmelisiniz:
# Display thde Dive visualization for this datafrom IPython.core.display import display, HTML# Create Facets templateHTML_TEMPLATE = """"""# Load the json dataset and the sprite_size into the templatehtml = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)# Display the templatedisplay(HTML(html)) Sektör oranı, oksit konsantrasyonu, iş merkezine olan uzaklık ve evin fiyatı arasında bir bağlantı olup olmadığını görmekle ilgileniyorsunuz.
Bunun için önce verileri sektör aralığına ve renge göre fiyat çeyreğiyle bölersiniz:
- Yontma X'i seçin ve INDUS'u seçin.
- Ekran'ı seçin ve DIS'i seçin. Noktaları ev fiyatının çeyreği ile renklendirecek
burada daha koyu renkler, ilk iş merkezine olan mesafenin uzak olduğu anlamına gelir.
Şimdiye kadar, bildiklerinizi, daha düşük endüstri oranını, daha yüksek fiyatı bir kez daha gösteriyor. Artık NOX tarafından INDUX'a göre döküme bakabilirsiniz.
- Yönlendirme Y'yi seçin ve NOX'i seçin.
Şimdi, ilk iş merkezinden uzaktaki evin en düşük endüstri payına ve dolayısıyla en düşük oksit konsantrasyonuna sahip olduğunu görebilirsiniz. Türü Q_PRICE ile görüntülemeyi ve sol alt köşeyi yakınlaştırmayı seçerseniz, ne tür bir fiyat olduğunu görebilirsiniz.
IND, NOX ve DIS arasındaki etkileşimin modeli geliştirmek için iyi adaylar olabileceğine dair başka bir ipucunuz var.
TensorFlow
Bu bölümde, doğrusal sınıflandırıcıyı TensorFlow tahmin ediciler API'si ile tahmin edeceksiniz. Aşağıdaki gibi ilerleyeceksiniz:
- Verileri hazırlayın
- Bir karşılaştırma modeli tahmin edin: Etkileşim yok
- Etkileşimli bir model tahmin edin
Unutmayın, makine öğreniminin amacı hatayı en aza indirmektir. Bu durumda, en düşük ortalama kare hatası olan model kazanacaktır. TensorFlow tahmin aracı bu ölçüyü otomatik olarak hesaplar.
Hazırlık verileri
Çoğu durumda, verilerinizi dönüştürmeniz gerekir. Facets Overview'ın büyüleyici olmasının nedeni budur. Özet istatistikten, aykırı değerler olduğunu gördünüz. Bu değerler tahminleri etkiler çünkü analiz ettiğiniz popülasyona benzemezler. Aykırı değerler genellikle sonuçları saptırdı. Örneğin, pozitif bir aykırı değer, katsayıyı fazla tahmin etme eğilimindedir.
Bu sorunu çözmek için iyi bir çözüm, değişkeni standartlaştırmaktır. Standardizasyon, bir standart sapma ve sıfır anlamına gelir. Standardizasyon süreci iki adımdan oluşur. Öncelikle değişkenin ortalama değerini çıkarır. İkinci olarak, dağılımın bir birim varyansı olması için varyansa böler.
Kütüphane sklearn, değişkenleri standartlaştırmaya yardımcı olur. Bunun için nesne ölçeği ile modül ön işlemesini kullanabilirsiniz.
Bir veri kümesini ölçeklendirmek için aşağıdaki işlevi kullanabilirsiniz. Etiket sütununu ve kategorik değişkenleri ölçeklemediğinizi unutmayın.
from sklearn import preprocessingdef standardize_data(df):X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']])X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'])df_scale = pd.concat([X_scaled_df,df['CHAS'],df['PRICE']],axis=1, join='inner')return df_scaleÖlçekli tren / test kümesini oluşturmak için işlevi kullanabilirsiniz.
df_train_scale = standardize_data(df_train)df_test_scale = standardize_data(df_test)Temel regresyon: Kıyaslama
Her şeyden önce, bir modeli etkileşim olmadan eğitir ve test edersiniz. Amaç, modelin performans metriğini görmektir.
Modeli eğitmenin yolu, tam olarak High-level API'deki öğreticiyle aynıdır . TensorFlow tahmincisi LinearRegressor'ı kullanacaksınız.
Bir hatırlatma olarak, seçmeniz gerekenler:
- modele eklenecek özellikler
- özellikleri dönüştürmek
- Doğrusal regresörü inşa et
- input_fn işlevini inşa et
- modeli eğit
- modeli test et
Modeli eğitmek için veri kümesindeki tüm değişkenleri kullanırsınız. Toplamda, yüksek sürekli değişkenler ve bir kategorik değişken vardır.
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']CATE_FEATURES = ['CHAS']Unsurları sayısal bir sütuna veya kategorik sütuna dönüştürürsünüz
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]Modeli linearRegressor ile oluşturursunuz. Modeli train_Boston klasöründe saklarsınız
model = tf.estimator.LinearRegressor(model_dir="train_Boston",feature_columns=categorical_features + continuous_features)Çıktı
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec':, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} Tren veya test verilerindeki her sütun get_input_fn işleviyle bir Tensöre dönüştürülür.
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']LABEL= 'PRICE'def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):return tf.estimator.inputs.pandas_input_fn(x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)Modeli tren verilerinde tahmin edersiniz.
model.train(input_fn=get_input_fn(df_train_scale,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into train_Boston/model.ckpt.INFO:tensorflow:loss = 56417.703, step = 1INFO:tensorflow:global_step/sec: 144.457INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)INFO:tensorflow:global_step/sec: 258.392INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)INFO:tensorflow:global_step/sec: 227.998INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)INFO:tensorflow:global_step/sec: 210.739INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)INFO:tensorflow:global_step/sec: 234.237INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)INFO:tensorflow:global_step/sec: 238.1INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)INFO:tensorflow:global_step/sec: 237.934INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)INFO:tensorflow:global_step/sec: 220.687INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)INFO:tensorflow:global_step/sec: 232.702INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec)INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt.INFO:tensorflow:Loss for final step: 23228.568.Sonunda, modelin performanslarını test setinde tahmin ediyorsunuz.
model.evaluate(input_fn=get_input_fn(df_test_scale,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}Modelin kaybı 1650'dir. Bu, sonraki bölümde geçilmesi gereken metriktir.
Modeli geliştirin: Etkileşim terimi
Eğitimin ilk bölümünde, değişkenler arasında ilginç bir ilişki gördünüz. Farklı görselleştirme teknikleri, INDUS ve NOS'un birbirine bağlı olduğunu ve fiyat üzerindeki etkiyi büyütmek için döndüğünü ortaya çıkardı. Sadece INDUS ve NOS arasındaki etkileşim fiyatı etkilemekle kalmaz, aynı zamanda DIS ile etkileşime girdiğinde bu etki daha güçlüdür.
Bu fikri genelleme ve model öngörülen modeli geliştirip geliştiremeyeceğinizi görmenin zamanı geldi.
Her veri kümesine iki yeni sütun eklemeniz gerekir: eğitim + test. Bunun için, etkileşim terimini hesaplamak için bir fonksiyon ve üçlü etkileşim terimini hesaplamak için başka bir fonksiyon yaratırsınız. Her işlev tek bir sütun oluşturur. Yeni değişkenler oluşturulduktan sonra, bunları eğitim veri kümesine ve test veri kümesine birleştirebilirsiniz.
Öncelikle INDUS ve NOX arasındaki etkileşim için yeni bir değişken oluşturmanız gerekir.
Aşağıdaki işlev, INDUS ve NOX durumunuzda var_1 ve var_2 arasındaki etkileşimle iki veri çerçevesi döndürür.
def interaction_term(var_1, var_2, name):t_train = df_train_scale[var_1]*df_train_scale[var_2]train = t_train.rename(name)t_test = df_test_scale[var_1]*df_test_scale[var_2]test = t_test.rename(name)return train, testİki yeni sütunu saklarsınız
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')interation_ind_ns_train.shape(325,)İkinci olarak, üçlü etkileşim terimini hesaplamak için ikinci bir fonksiyon yaratırsınız.
def triple_interaction_term(var_1, var_2,var_3, name):t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]train = t_train.rename(name)t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]test = t_test.rename(name)return train, testinteration_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')Artık gerekli tüm sütunlara sahip olduğunuza göre, bunları veri kümesini eğitmek ve test etmek için ekleyebilirsiniz. Bu iki yeni veri çerçevesini adlandırın:
- df_train_new
- df_test_new
df_train_new = pd.concat([df_train_scale,interation_ind_ns_train,interation_ind_ns_dis_train],axis=1, join='inner')df_test_new = pd.concat([df_test_scale,interation_ind_ns_test,interation_ind_ns_dis_test],axis=1, join='inner')df_train_new.head(5)Çıktı
İşte bu; Yeni modeli etkileşim terimleriyle tahmin edebilir ve performans metriğinin nasıl olduğunu görebilirsiniz.
CONTI_FEATURES_NEW = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS']### Define categorical listcontinuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]model = tf.estimator.LinearRegressor(model_dir="train_Boston_1",feature_columns= categorical_features + continuous_features_new)Çıktı
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec':, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} KODU
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']LABEL= 'PRICE'def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):return tf.estimator.inputs.pandas_input_fn(x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)model.train(input_fn=get_input_fn(df_train_new,num_epochs=None,n_batch = 128,shuffle=False),steps=1000)Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Create CheckpointSaverHook.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Saving checkpoints for 1 into train_Boston_1/model.ckpt.INFO:tensorflow:loss = 56417.703, step = 1INFO:tensorflow:global_step/sec: 124.844INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)INFO:tensorflow:global_step/sec: 182.704INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)INFO:tensorflow:global_step/sec: 208.189INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)INFO:tensorflow:global_step/sec: 213.855INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)INFO:tensorflow:global_step/sec: 209.758INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)INFO:tensorflow:global_step/sec: 196.618INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)INFO:tensorflow:global_step/sec: 196.472INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)INFO:tensorflow:global_step/sec: 172.82INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)INFO:tensorflow:global_step/sec: 168.916INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec)INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt.INFO:tensorflow:Loss for final step: 19598.387.model.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}Yeni kayıp 1515'tir. Sadece iki yeni değişken ekleyerek kaybı azaltabildiniz. Bu, kıyaslama modelinden daha iyi bir tahmin yapabileceğiniz anlamına gelir.