Faset ve Etkileşim Terimiyle TensorFlow Doğrusal Regresyon

Bu eğitimde verileri nasıl kontrol edeceğinizi ve basit bir doğrusal regresyon görevi oluşturmaya 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

içinde önceki ders, bir evin ortalama fiyatını tahmin etmek için Boston veri kümesini kullandınız. Boston veri seti yalnızca 506 gözlemden oluşan küçük bir boyuta sahiptir. Bu veri kümesi, yeni doğrusal regresyon algoritmalarını denemek için bir kıyaslama olarak kabul edilir.

Veri kümesi şunlardan oluşur:

Değişken Açıklama
zn 25,000 metrekarenin üzerindeki parseller için imar edilen konut arazilerinin oranı.
indus Kasaba başına perakende olmayan iş alanları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 olan ağırlıklı mesafeler
vergi Dolar başına tam değerli emlak vergisi oranı 10,000
ptratio bir kasabaya göre öğrenci-öğretmen oranı
Medv Sahibi tarafından kullanılan evlerin ortalama değeri bin dolar olarak
suç Şehirlere göre kişi başına düşen suç oranı
chas Charles River kukla değişkeni (nehri sınırlarsa 1; aksi takdirde 0)
B kasabaya göre siyahların oranı

Bu derste, ortalama fiyatı doğrusal bir regresör kullanarak tahmin edeceğiz ancak odak noktası, belirli bir süreç üzerindedir. makine öğrenme: "veri Hazırlama."

Bir model, verilerdeki modeli genelleştirir. Böyle bir modeli 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 özelliklerin seçilmesi modelinizin başarısında büyük fark yaratır. Bir kişinin ücretini tahmin etmeye çalıştığınızı düşünün; eğer cinsiyeti ortak değişken olarak dahil etmezseniz, kötü bir tahmin elde edersiniz.

Modeli geliştirmenin bir başka yolu da bağımsız değişken arasındaki korelasyona bakmaktır. Örneğe dönecek olursak, eğitimi ücreti ve aynı zamanda mesleği tahmin etmek için mükemmel bir aday olarak düşünebilirsiniz. Mesleğin eğitim düzeyine bağlı olduğunu, yani yüksek öğrenimin çoğu zaman daha iyi bir mesleğe yol açtığını söylemek doğru olur. Bu fikri genelleştirirsek, bağımlı değişken ile açıklayıcı değişken arasındaki korelasyonun başka bir açıklayıcı değişkenle büyütülebileceğini söyleyebiliriz.

Eğitimin meslek üzerindeki sınırlı etkisini yakalamak için bir etkileşim terimi kullanabiliriz.

Etkileşim terimi

Ücret denklemine bakarsanız şöyle olur:

Etkileşim terimi

If Etkileşim terimi pozitifse, bu, ek eğitim düzeyinin, yüksek meslek düzeyi için bir evin ortalama değerinde daha yüksek bir artışa yol açtığı anlamına gelir. Başka bir deyişle eğitim ile meslek arasında etkileşim etkisi vardır.

Bu derste 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.

Özet istatistikler

Modele geçmeden önce takip edebileceğiniz birkaç adım var. Daha önce de belirtildiği gibi model, verilerin genelleştirilmesidir. En uygun uygulama, verileri anlamak ve bir tahminde bulunmaktır. Verilerinizi bilmiyorsanız modelinizi geliştirme şansınız çok azdır.

İlk adım olarak verileri bir pandas veri çerçevesi olarak yükleyin ve bir eğitim seti ve test seti oluşturun.

İpuçları: Bu eğitim için matplotlit ve seaborn'un kurulu olması gerekir. Python. yükleyebilirsiniz Python anında paket Jupyter. Sen Yapmamalı Bunu yap

!conda install -- yes matplotlib

fakat

import sys
!{sys.executable} -m pip install matplotlib # Already installed
!{sys.executable} -m pip install seaborn 

Matplotlib ve seaborn'un kurulu olması durumunda bu adımın gerekli olmadığını unutmayın.

Matplotlib grafik oluşturmak için kullanılan kütüphanedir. PythonSeaborn, matplotlib üzerine kurulu bir istatistiksel görselleştirme kütüphanesidir. Aşağıdaki özellikleri sağlar:tracCanlı ve güzel arsalar.

Aşağıdaki kod gerekli kütüphaneleri içe aktarır.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Sklearn kütüphanesi Boston veri setini içerir. Verileri içe aktarmak için API'sini arayabilirsiniz.

boston = load_boston()
df = pd.DataFrame(boston.data)

Özelliğin adı bir dizideki özellik_isimleri nesnesinde saklanır.

boston.feature_names

Çıktı

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

Sütunları yeniden adlandırabilirsiniz.

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

Faset ve Etkileşim Terimi ile Doğrusal Regresyon

CHAS değişkenini bir dize değişkeni olarak dönüştürürsünüz ve CHAS = 1 ise evet, CHAS = 0 ise hayır olarak etiketlersiniz.

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

Pandalarla veri kümesini bölmek kolaydır. Veri kümesini yüzde 80'i eğitim seti ve yüzde 20'si test seti olacak şekilde 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'dan 1'e kadar bir değerdir. Veri çerçevesinin yüzde 0.8'ini rastgele seçmek için bunu 80'e ayarlarsınız.

Random_state, herkes için aynı veri çerçevesinin döndürülmesine olanak tanır.

### Create train/test set
df_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ı

suç ZN ENDÜSTRİ CAS NOX RM YAŞ DIS RAD VERGİ PTRATIO B LSTAT FİYAT
0 0.00632 18.0 2.31 yok 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 yok 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 yok 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 yok 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 yok 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ıktır; genellikle dengesizdir ve analiz ve makine öğrenimi eğitimini boşa çıkaran aykırı değerlerle serpilir.

Veri kümesini temizlemenin ilk adımı, nerede temizlenmesi gerektiğini anlamaktır. Bir veri kümesini temizlemek, özellikle genelleştirilebilir bir şekilde yapmak zor olabilir

Google Araştırma ekibi bu iş için bir araç geliştirdi. YÖNÜ Bu, verileri görselleştirmeye ve onu her türlü şekilde dilimlemeye yardımcı olur. Bu, veri kümesinin nasıl düzenlendiğini anlamak için iyi bir başlangıç ​​noktasıdır.

Yönler, verilerin tam olarak düşündüğünüz gibi görünmediği yerleri bulmanızı sağlar.

Web uygulamaları hariç, Google Bu, araç setini kolayca entegre etmeyi sağlar. Jupyter not defteri.

Facet'lerin iki bölümü vardır:

  • Özelliklere Genel Bakış
  • Yönlerin Derinlemesine İncelemesi

Özelliklere Genel Bakış

Facets Genel Bakış, veri kümesinin genel bir görünümünü sunar. Facets Genel Bakış, veri sütunlarını belirgin bilgilerin satırlarına bölerek gösterir

  1. eksik gözlem yüzdesi
  2. minimum ve maksimum değerler
  3. ortalama, medyan ve standart sapma gibi istatistikler.
  4. Ayrıca sıfır olan değerlerin yüzdesini gösteren bir sütun da ekler; bu, değerlerin çoğu sıfır olduğunda faydalıdır.
  5. Bu dağılımları hem test veri setinde hem de her bir özellik için eğitim setinde görmek mümkündür. Bu, testin eğitim verilerine benzer bir dağılıma sahip olduğunu iki kez kontrol edebileceğiniz anlamına gelir.

Bu, en azından herhangi bir makine öğrenimi görevinden önce yapılması gereken minimum işlemdir. Bu araçla bu önemli adımı kaçırmazsınız ve bazı anormallikleri vurgularsınız.

Yönlerin Derinlemesine İncelemesi

Facets Deep Dive harika bir araçtır. Veri kümenizde biraz netlik sağlamanıza ve tek bir veri parçasını görmek için tamamen yakınlaştırmanıza olanak tanır. Bu, veri kümesinin herhangi bir özelliği boyunca verileri satır ve sütuna göre yönlendirebileceğiniz anlamına gelir.

Bu iki aracı Boston veri seti ile kullanacağız.

not: Yönlere Genel Bakış ve Yönlerin Derinlemesine Dalışını aynı anda kullanamazsınız. Aracı değiştirmek için önce not defterini temizlemeniz gerekir.

Faset'i yükle

Analizin çoğu için Facet web uygulamasını kullanabilirsiniz. Bu eğitimde, bunu bir süre içinde nasıl kullanacağınızı göreceksiniz. Jupyter Defter.

Öncelikle nbextensions'ı kurmanız gerekiyor. Bu kodla yapılır. Aşağıdaki kodu kopyalayıp makinenizin terminaline yapıştırın.

pip install jupyter_contrib_nbextensions

Bundan 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)

Bilgisayarınızda Git yüklü değilse lütfen buraya gidin. URL https://git-scm.com/download/win ve talimatları izleyin. İşiniz bittiğinde, Mac Kullanıcısı için terminaldeki git komutunu veya Anaconda komut istemini kullanabilirsiniz. Windows kullanıcı

git clone https://github.com/PAIR-code/facets

Seçenek 2) MyCAD'de yazılım Güncelleme ye git https://github.com/PAIR-code/facets ve depoları indirin.

Faset'i yükle

İlk seçeneği tercih ederseniz, dosya indirdiğiniz dosyanın içinde yer alır. Dosyanın indirilmesine izin verebilir veya başka bir yola sürükleyebilirsiniz.

Bu komut satırıyla Facet'lerin nerede saklandığını kontrol edebilirsiniz:

echo `pwd`/`ls facets`

Artık Facets'i bulduğunuza göre, onu yüklemeniz gerekiyor. Jupyter Not defteri. Çalışma dizinini, özelliklerin bulunduğu yola ayarlamanız gerekir.

Mevcut çalışma dizininiz ve Facets zip konumunuz aynı olmalıdır.

Faset'i yükle

Çalışma dizinini Facet'e yönlendirmeniz gerekir:

cd facets

Facets'i yüklemek için Jupyter, iki seçeneğiniz var. Eğer yüklediyseniz Jupyter Conda ile tüm kullanıcılar için bu kodu kopyalayın:

jupyter nbextension install facets-dist/ kullanabilirsiniz

jupyter nbextension install facets-dist/

Aksi takdirde şunu kullanın:

jupyter nbextension install facets-dist/ --user

Pekala, hazırsınız. Faset Genel Bakış'ı açalım.

Genel Bakış

Genel bakış bir kullanır Python istatistikleri hesaplamak için komut dosyası. generic_feature_statistics_generator adlı komut dosyasını içe aktarmanız gerekir Jupyter. Merak etme; komut dosyası, faset dosyalarında bulunur.

Onun yolunu bulmanız gerekiyor. Kolayca yapılır. Faset'leri açıyorsunuz, facets_overview dosyasını ve ardından python'u açıyorsunuz. Yolu kopyala

Genel Bakış Faset

Ondan sonra geri dön Jupyterve aşağıdaki kodu yazın. '/Users/Thomas/facets/facets_overview/python' yolunu kendi yolunuzla değiştirin.

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

Komut dosyasını aşağıdaki kodla içe aktarabilirsiniz.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

Windows'ta aynı kod şu şekilde olur:

import sys
sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")

from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

Özellik istatistiklerini hesaplamak için GenericFeatureStatistics fonksiyonunu kullanmanız gerekir.Generator() ve ProtoFromDataFrames nesnesini kullanırsınız. Veri çerçevesini bir sözlüğe aktarabilirsiniz. Örneğin tren seti için özet istatistik oluşturmak istersek bilgiyi bir sözlükte saklayabilir ve `ProtoFromDataFrames' nesnesinde kullanabiliriz.

  • 'name': 'train', 'table': df_train

Ad, tablonun görüntülendiği adıdır ve özetini hesaplamak istediğiniz tablonun adını kullanırsınız. Örneğinizde verileri içeren tablo df_train'dir

# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview
import base64

gfsg = 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 yeterli. Kod doğrudan GitHub'dan geliyor. Bunu görebilmelisiniz:

Genel Bakış Faset

# Display the facets overview visualization for this data# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/tr/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
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 olup, pozitif değer pozitif korelasyonu, negatif değer ise negatif korelasyonu gösterir.

Hangi değişkenlerin etkileşim terimleri için iyi bir aday olabileceğini görmek ilginizi çekiyor.

## Choose important feature and further check with Dive
%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

Çıktı

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

png

Faset Grafiği

Matristen şunları görebilirsiniz:

  • LSTAT
  • RM

PRICE ile güçlü bir korelasyona sahiptir. Bir başka heyecan verici özellik ise NOX ve INDUS arasındaki güçlü pozitif korelasyondur; bu, bu iki değişkenin aynı yönde hareket ettiği anlamına gelir. Ayrıca FİYAT ile korelasyonu da vardır. DIS aynı zamanda IND ve NOX ile de oldukça ilişkilidir.

IND ve NOX'in engelleme terimi için iyi adaylar olabileceğine ve DIS'in de üzerinde durulması ilginç olabileceğine dair ilk ipucunuz 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 ızgarası aşağıdaki gibidir:

  • Üst kısım: Yerleştirilmiş çizgiyle dağılım grafiği
  • Çapraz: Ç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

üstelik FİYAT.

not standart hatanın varsayılan olarak dağılım grafiğine eklendiğini gösterir.

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ı

Faset Grafiği

Üst kısımla başlayalım:

  • Fiyat INDUS, NOX ve LSTAT ile negatif ilişkilidir; RM ile pozitif korelasyona sahiptir.
  • LSTAT ve PRICE arasında biraz doğrusal olmayan bir durum var
  • Fiyat 50'ye eşit olduğunda düz bir çizgi vardır. Veri kümesinin açıklamasına göre PRICE, 50 değerinde kesilmiştir.

Köşegen

  • NOX'in biri 0.5 civarında ve diğeri 0.85 civarında olmak üzere iki kümesi var gibi 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 bulunduğu yeri renklendirmesi açısından ilginçtir. Veri kümesinde belirli bir koordinat için hiçbir nokta olmamasına rağmen, dağılım grafiğindeki fark bir olasılık yoğunluğu çizer. Rengin daha güçlü olması bu alanın çevresinde yüksek bir nokta konsantrasyonuna işaret eder.

INDUS ve NOX'in çok değişkenli yoğunluğunu kontrol ederseniz pozitif korelasyonu ve iki kümeyi görebilirsiniz. Sanayinin payı yüzde 18'in üzerinde olduğunda nitrik oksit konsantrasyonu 0.6'nın üzerinde oluyor.

INDUS ve NOX arasına doğrusal ilişkiye bir etkileşim eklemeyi düşünebilirsiniz.

Son olarak, tarafından oluşturulan ikinci araçları kullanabilirsiniz. GoogleFacets Deep Dive. Arayüz dört ana bölüme ayrılmıştır. Ortadaki alan, verilerin yakınlaştırılabilir bir görüntüsüdür. Panelin üst kısmında, veri düzenini değiştirmek, fasetlemeyi, konumlandırmayı ve rengi kontrol etmek için kullanabileceğiniz açılır menü bulunur. Sağda, belirli bir veri satırının ayrıntılı görünümü yer alır. Bu, ortadaki görselleştirmedeki herhangi bir veri noktasına tıklayarak o veri noktası hakkında ayrıntılı bilgi görebileceğiniz anlamına gelir.

Veri görselleştirme adımı sırasında, evin fiyatındaki bağımsız değişken arasındaki çift yönlü korelasyonu aramakla ilgileniyorsunuz. Ancak, en az üç değişkeni içerir ve 3B grafiklerle çalışmak karmaşıktır.

Bu sorunu çözmenin bir yolu kategorik bir değişken oluşturmaktır. Yani, noktayı renklendiren 2 boyutlu bir çizim oluşturabiliriz. PRICE değişkenini dört kategoriye ayırabilirsiniz; her kategori bir çeyrektir (yani 0.25, 0.5, 0.75). Bu yeni değişkene Q_PRICE adını verirsiniz.

## Check non linearity with important features
df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
## Show non linearity between RM and LSTAT
ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Faset Grafiği

Yönlerin Derinlemesine İncelemesi

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'u kullanabilirsiniz.

Kodun ilk satırı veri kümesinin boyutunu işler.

df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
sprite_size = 32 if len(df.index)>50000 else 64
jsonstr = df.to_json(orient='records')

Aşağıdaki kod şuradan geliyor: Google GitHub. Kodu çalıştırdıktan sonra şunu görmelisiniz:

Yönlerin Derinlemesine İncelemesi

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/tr/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(HTML(html))

Endüstri oranı, oksit konsantrasyonu, iş merkezine uzaklık ve evin fiyatı arasında bir bağlantı olup olmadığını görmek istiyorsunuz.

Bunun için önce verileri sektör aralığına ve renge göre fiyat çeyreğiyle bölersiniz:

  • Faceting X'i seçin ve INDUS'u seçin.
  • Ekran'ı seçin ve DIS'i seçin. Noktaları ev fiyatının dörtte biri ile renklendirecek

burada daha koyu renkler ilk iş merkezine olan mesafenin uzak olduğu anlamına gelir.

Şu ana kadar yine bildiğinizi gösteriyor; daha düşük endüstri oranı, daha yüksek fiyat. Artık INDUX ve NOX'a göre dağılıma bakabilirsiniz.

  • Yönlendirme Y'yi seçin ve NOX'u 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. Q_PRICE ile türü 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 daha var.

TensorFlow

Bu bölümde TensorFlow tahmin araçları API'si ile doğrusal sınıflandırıcıyı tahmin edeceksiniz. Aşağıdaki gibi ilerleyeceksin:

  • Verileri hazırlayın
  • Bir kıyaslama modeli tahmin edin: Etkileşim yok
  • Etkileşimli bir modeli tahmin edin

Unutmayın, makine öğreniminin amacı hatayı en aza indirmektir. Bu durumda ortalama karesel hatası en düşük olan model kazanacaktır. TensorFlow tahmincisi bu ölçümü otomatik olarak hesaplar.

Hazırlık verileri

Çoğu durumda verilerinizi dönüştürmeniz gerekir. Yönlere Genel Bakış'ın büyüleyici olmasının nedeni budur. Özet istatistiğinden aykırı değerlerin olduğunu gördünüz. Bu değerler analiz ettiğiniz popülasyona benzemediğinden tahminleri etkiler. Aykırı değerler genellikle sonuçları saptırdı. Örneğin, pozitif bir aykırı değer, katsayıyı olduğundan fazla tahmin etme eğilimindedir.

Bu sorunu çözmek için iyi bir yöntem, değişkeni standartlaştırmaktır. Standartlaştırma, standart sapmanın bir ve ortalamanın sıfır olması anlamına gelir. Standartlaştırma süreci iki adımdan oluşur. Öncelikle, değişkenin standart sapması sıfıra indirilir.tracİlk olarak, değişkenin ortalama değerini hesaplar. İkinci olarak, dağılımın birim standart sapmaya sahip olması için standart sapmaya böler.

Sklearn kütüphanesi değişkenleri standartlaştırmaya yardımcı olur. Bu amaçla nesne ölçeğiyle 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çeklendirmediğinizi unutmayın.

from sklearn import preprocessing
def 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çeklendirilmiş eğitim/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: Karşılaştırma

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 eğitimdeki gibidir. Üst düzey API. TensorFlow tahmin aracı LinearRegressor'u kullanacaksınız.

Bir hatırlatma olarak şunları seçmeniz gerekir:

  • modele eklenecek özellikler
  • özellikleri dönüştür
  • doğrusal regresörü oluşturun
  • input_fn işlevini oluşturun
  • modeli eğit
  • modeli test et

Modeli eğitmek için veri kümesindeki tüm değişkenleri kullanırsınız. Toplamda, düzey sürekli değişkenler ve bir kategorik değişken bulunmaktadır.

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']
CATE_FEATURES = ['CHAS']

Özellikleri sayısal bir sütuna veya kategorik bir 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 lineerRegressor ile yaratırsınız. Modeli train_Boston klasöründe saklıyorsunuz

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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_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 Tensor'a 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 verilerine göre 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 = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

Son olarak modelin test setindeki performansını tahmin edersiniz.

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:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO: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, bir 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ütecek şekilde döndüğünü ortaya çıkardı. INDUS ve NOS arasındaki etkileşim fiyatı etkilediği gibi, DIS ile etkileşime girdiğinde de bu etki daha güçlü oluyor.

Bu fikri genelleştirmenin ve modelin öngördüğü modeli geliştirip iyileştiremeyeceğinizi görmenin zamanı geldi.

Her veri kümesi 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 fonksiyon tek bir sütun üretir. 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 gerekiyor.

Aşağıdaki işlev, INDUS ve NOX durumunuzda var_1 ve var_2 arasındaki etkileşimle birlikte eğitim ve test olmak üzere 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 saklıyorsunuz

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, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

Artık ihtiyacınız olan 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çevesine isim verin:

  • 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ı

Model Etkileşim Süresini İyileştirin

İş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 list
continuous_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_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}

KOD

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 = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
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:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO: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. Sadece iki yeni değişken ekleyerek kaybı azaltabildiniz. Bu, kıyaslama modelinden daha iyi bir tahmin yapabileceğiniz anlamına gelir.

Bu yazıyı şu şekilde özetleyin: