Doğrusal Regresyon nedir?
Doğrusal Regresyon , iki değişken arasındaki ilişkileri modellemek için istatistikte bir yaklaşımdır. Bu modelleme, bir skaler yanıt ile bir veya daha fazla açıklayıcı değişken arasında yapılır. Bir açıklayıcı değişkenle olan ilişkiye basit doğrusal regresyon ve birden fazla açıklayıcı değişken için çoklu doğrusal regresyon denir.
TensorFlow, hesaplamalar üzerinde tam kontrole sahip olmak için araçlar sağlar. Bu, düşük seviyeli API ile yapılır. Bunun da ötesinde, TensorFlow, birçok makine öğrenimi algoritmasını gerçekleştirmek için geniş bir API dizisi ile donatılmıştır. Bu, üst düzey API'dir. TensorFlow onlara tahminci diyor
- Düşük seviyeli API: Modelin mimarisini, optimizasyonunu sıfırdan oluşturun. Yeni başlayanlar için karmaşık
- Üst düzey API: Algoritmayı tanımlayın. Kolaydır. TensorFlow, bir tahmin oluşturmak, eğitmek, değerlendirmek ve tahmin yapmak için tahmin ediciyi çağıran bir araç kutusu sağlar .
Bu eğiticide, yalnızca tahmin edicileri kullanacaksınız . Hesaplamalar daha hızlı ve uygulanması daha kolay. Öğreticinin ilk bölümü, TensorFlow'da bir Doğrusal regresyon eğitmek için gradyan iniş optimize edicinin nasıl kullanılacağını açıklar. İkinci bölümde, TensorFlow tahmin aracını kullanarak bir evin fiyatını tahmin etmek için Boston veri kümesini kullanacaksınız.
Boston DataSet'i indirin
Bu TensorFlow Regresyon eğitiminde şunları öğreneceksiniz:
- Doğrusal regresyon nedir?
- Doğrusal bir regresyon modeli nasıl eğitilir
- TensorFlow ile Doğrusal Regresyon nasıl eğitilir
- Pandalar
- Uyuşmuş Çözüm
- Tensorflow çözümü
Doğrusal bir regresyon modeli nasıl eğitilir
Modeli eğitmeye başlamadan önce, doğrusal regresyonun ne olduğuna bakalım.
İki değişkeniniz olduğunu hayal edin, x ve y ve görevinizin değerini bilmenin değerini tahmin etmek. Verileri çizerseniz, bağımsız değişkeniniz x ve bağımlı değişkeniniz y arasında pozitif bir ilişki görebilirsiniz.
X = 1 ise y'nin kabaca 6'ya eşit olacağını ve x = 2 ise y'nin 8,5 civarında olacağını gözlemleyebilirsiniz.
Bu çok doğru bir yöntem değildir ve özellikle yüz binlerce noktadan oluşan bir veri kümesinde hata yapmaya meyillidir.
Doğrusal bir regresyon, bir denklemle değerlendirilir. Y değişkeni, bir veya daha fazla ortak değişkenle açıklanır. Örneğinizde, yalnızca bir bağımlı değişken var. Bu denklemi yazmanız gerekiyorsa, şöyle olacaktır:
İle:
- x ile ilişkili ağırlık
- modelin artığı veya hatasıdır. Modelin verilerden öğrenemeyeceğini içerir
Modele uyduğunuzu ve aşağıdakiler için aşağıdaki çözümü bulduğunuzu hayal edin:
- = 3.8
- = 2.78
Denklemde bu sayıları değiştirebilirsin ve bu şöyle olur:
y = 3,8 + 2,78x
Artık y için değerleri bulmanın daha iyi bir yoluna sahipsiniz. Yani, y'yi tahmin etmek istediğiniz herhangi bir değerle x'i değiştirebilirsiniz. Aşağıdaki resimde, denklemdeki x'i veri kümesindeki tüm değerlerle değiştirdik ve sonucu çizdik.
Kırmızı çizgi, her x değeri için y'nin değerleri olan uyan değeri temsil eder. Y'yi tahmin etmek için x'in değerini görmenize gerek yok, her x için kırmızı çizgiye ait olanlar var. 2'den büyük x değerleri için de tahmin yapabilirsiniz!
Doğrusal regresyonu daha fazla ortak değişkene genişletmek istiyorsanız, modele daha fazla değişken ekleyerek bunu yapabilirsiniz. Geleneksel analiz ile doğrusal regresyon arasındaki fark, doğrusal regresyonun, bağımsız olarak alınan her x değişkeni için y'nin nasıl tepki vereceğine bakmasıdır.
Bir örnek görelim. Bir dondurma dükkanının satışını tahmin etmek istediğinizi hayal edin. Veri seti, hava durumu (örn. Yağmurlu, güneşli, bulutlu), müşteri bilgileri (örn. Maaş, cinsiyet, medeni durum) gibi farklı bilgileri içerir.
Geleneksel analiz, diyelim ki her değişken için ortalamayı hesaplayarak satışı tahmin etmeye ve farklı senaryolar için satışı tahmin etmeye çalışacaktır. Kötü tahminlere yol açacak ve analizi seçilen senaryo ile sınırlayacaktır.
Doğrusal regresyon kullanıyorsanız, bu denklemi yazabilirsiniz:
Algoritma, ağırlıklar için en iyi çözümü bulacaktır; maliyeti (takılan hat ile veri noktaları arasındaki fark) en aza indirmeye çalışacağı anlamına gelir.
Algoritma nasıl çalışır?
Algoritma, her biri için rastgele bir sayı seçecek y'nin tahmin edilen değerini elde etmek için x'in değerini değiştirecektir. Veri kümesinde 100 gözlem varsa, algoritma 100 öngörülen değeri hesaplar.
Tahmin edilen değer ile gerçek değer arasındaki fark olan modelin not ettiği hatayı hesaplayabiliriz . Pozitif bir hata, modelin y tahminini olduğundan az hesapladığı anlamına gelir ve negatif bir hata, modelin y tahminini olduğundan fazla hesapladığı anlamına gelir.
Amacınız hatanın karesini en aza indirmektir. Algoritma, kare hatasının ortalamasını hesaplar. Bu adım, hatanın en aza indirilmesi olarak adlandırılır. Doğrusal regresyon için, MSE olarak da adlandırılan Ortalama Kare Hata'dır. Matematiksel olarak şu:
Nerede:
- tahmin edilen değeri ifade eder
- y gerçek değerlerdir
- m, gözlemlerin sayısıdır
Ortalama matematiksel bir nottur.
Amaç, MSE'yi en aza indiren en iyisini bulmaktır.
Ortalama hata büyükse, modelin kötü performans gösterdiği ve ağırlıkların doğru seçilmediği anlamına gelir. Ağırlıkları düzeltmek için bir optimize edici kullanmanız gerekir. Geleneksel optimize ediciye Gradient Descent denir .
Gradyan inişi türevi alır ve ağırlığı azaltır veya arttırır. Türev pozitif ise ağırlık azaltılır. Türev negatifse ağırlık artar. Model ağırlıkları güncelleyecek ve hatayı yeniden hesaplayacaktır. Bu işlem, hata artık değişmeyene kadar tekrar edilir. Her işlem bir yineleme olarak adlandırılır . Ayrıca, gradyanlar bir öğrenme oranıyla çarpılır. Öğrenmenin hızını gösterir.
Öğrenme hızı çok küçükse, algoritmanın yakınsaması çok uzun zaman alacaktır (yani çok sayıda yineleme gerektirir). Öğrenme hızı çok yüksekse, algoritma asla yakınsamayabilir.
Yukarıdaki resimden de görebileceğiniz gibi, model, ağırlıklar için kararlı bir değer bulmak için işlemi önceden yaklaşık 20 kez tekrarlar, dolayısıyla en düşük hataya ulaşır.
Hatanın sıfıra eşit olmadığını , ancak 5 civarında stabilize olduğunu unutmayın. Bu, modelin tipik olarak 5 hata yaptığı anlamına gelir. Hatayı azaltmak istiyorsanız, modele daha fazla değişken veya kullanım gibi daha fazla bilgi eklemeniz gerekir. farklı tahmin ediciler.
İlk denklemi hatırlıyorsun
Nihai ağırlıklar 3.8 ve 2.78'dir. Aşağıdaki video, gradyan inişinin bu ağırlıkları bulmak için kayıp fonksiyonunu nasıl optimize ettiğini göstermektedir.
TensorFlow ile Doğrusal Regresyon nasıl eğitilir
Artık kaputun arkasında neler olduğunu daha iyi anladığınıza göre, TensorFlow kullanarak ilk doğrusal regresyonunuzu eğitmek için TensorFlow tarafından sağlanan tahmin edici API'yi kullanmaya hazırsınız.
Aşağıdaki değişkenleri içeren Boston Veri Kümesini kullanacaksınız
suç | şehre göre kişi başına suç oranı |
---|---|
zn | 25.000 sq.ft.'nin üzerindeki parseller için imarlı konut arazisi oranı |
Endüstri | şehir başına perakende dışı iş 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 | şehre göre öğrenci-öğretmen oranı |
medv | Sahibi tarafından kullanılan evlerin medyan değeri bin dolar olarak |
Üç farklı veri kümesi oluşturacaksınız:
veri kümesi | amaç | şekil |
---|---|---|
Eğitim | Modeli eğitin ve ağırlıkları alın | 400, 10 |
Değerlendirme | Modelin görünmeyen veriler üzerindeki performansını değerlendirin | 100, 10 |
Tahmin | Yeni verilerde ev değerini tahmin etmek için modeli kullanın | 6, 10 |
Amaç, evin değerini tahmin etmek için veri setinin özelliklerini kullanmaktır.
Eğitimin ikinci bölümünde, verileri içe aktarmanın üç farklı yolu ile TensorFlow'u nasıl kullanacağınızı öğreneceksiniz:
- Pandalar ile
- Numpy ile
- Sadece TF
Tüm seçeneklerin aynı sonuçları verdiğini unutmayın.
Bir TensorFlow doğrusal regresyon modeli oluşturmak, eğitmek ve değerlendirmek için üst düzey API'yi nasıl kullanacağınızı öğreneceksiniz. Düşük seviyeli API kullanıyorsanız, aşağıdakileri elle tanımlamanız gerekir:
- Kayıp işlevi
- Optimize et: Gradyan inişi
- Matris çarpımı
- Grafik ve tensör
Bu, yeni başlayanlar için sıkıcı ve daha karmaşıktır.
Pandalar
Modeli eğitmek için gerekli kitaplıkları içe aktarmanız gerekir.
import pandas as pdfrom sklearn import datasetsimport tensorflow as tfimport itertools
Adım 1) Verileri panda ile içe aktarın.
Sütun adlarını tanımlar ve SÜTUNLAR'da saklayın. Verileri içeri aktarmak için pd.read_csv () öğesini kullanabilirsiniz.
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age","dis", "tax", "ptratio", "medv"]
training_set = pd.read_csv ("E: /boston_train.csv", skipinitialspace = True, skiprows = 1, names = COLUMNS)
test_set = pd.read_csv ("E: /boston_test.csv", skipinitialspace = True, skiprows = 1, names = COLUMNS)
prediction_set = pd.read_csv ("E: /boston_predict.csv", skipinitialspace = True, skiprows = 1, names = COLUMNS)
Verilerin şeklini yazdırabilirsiniz.
print(training_set.shape, test_set.shape, prediction_set.shape)
Çıktı
(400, 10) (100, 10) (6, 10)
Etiketin, yani y'nizin veri kümesine dahil edildiğini unutmayın. O halde iki liste daha tanımlamanız gerekiyor. Yalnızca özellikleri içeren ve yalnızca etiketin adını içeren biri Bu iki liste, tahmincinize veri kümesindeki özelliklerin neler olduğunu ve etiketin hangi sütun adının olduğunu söyleyecektir.
Aşağıdaki kod ile yapılır.
FEATURES = ["crim", "zn", "indus", "nox", "rm","age", "dis", "tax", "ptratio"]LABEL = "medv"
Adım 2) Verileri dönüştürün
Sayısal değişkenleri uygun biçimde dönüştürmeniz gerekir. Tensorflow, sürekli değişkeni dönüştürmek için bir yöntem sağlar: tf.feature_column.numeric_column ().
Önceki adımda, modele dahil etmek istediğiniz bir özellik listesi tanımladınız. Şimdi bu listeyi sayısal verilere dönüştürmek için kullanabilirsiniz. Modelinizdeki özellikleri hariç tutmak istiyorsanız, feature_cols'u oluşturmadan önce ÖZELLİKLER listesine bir veya daha fazla değişkeni bırakabilirsiniz.
Feature_cols adlı yeni bir liste oluşturmak için ÖZELLİKLER listesiyle birlikte Python liste anlama özelliğini kullanacağınızı unutmayın. Dokuz kez tf.feature_column.numeric_column () yazmaktan kaçınmanıza yardımcı olur. Liste anlama, yeni listeler oluşturmanın daha hızlı ve daha anlaşılır bir yoludur
feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]
Adım 3) Tahmin ediciyi tanımlayın
Bu adımda tahmin ediciyi tanımlamanız gerekir. Tensorflow şu anda, sınıflandırma görevi için 3 ve TensorFlow regresyon görevi için 3 olmak üzere önceden oluşturulmuş 6 tahminci sağlamaktadır:
- Regresör
- DNNRegressor
- Doğrusal Regresör
- DNNLineaCombinedRegressor
- Sınıflandırıcı
- DNNC sınıflandırıcı
- Doğrusal Sınıflandırıcı
- DNNLineaCombinedClassifier
Bu eğitimde, Doğrusal Regresörü kullanacaksınız. Bu işleve erişmek için tf.estimator kullanmanız gerekir.
Fonksiyonun iki argümana ihtiyacı vardır:
- feature_columns: Modele dahil edilecek değişkenleri içerir
- model_dir: grafiği saklama, model parametrelerini kaydetme vb. yol
Tensorflow, çalışma dizininizde otomatik olarak train adlı bir dosya oluşturacaktır. Aşağıdaki TensorFlow regresyon örneğinde gösterildiği gibi Tensorboard'a erişmek için bu yolu kullanmanız gerekir.
estimator = tf.estimator.LinearRegressor(feature_columns=feature_cols,model_dir="train")
Çıktı
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train', '_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}
TensorFlow'un zor kısmı, modeli beslemenin yoludur. Tensorflow, paralel hesaplama ve çok büyük veri kümesiyle çalışmak üzere tasarlanmıştır. Makine kaynaklarının sınırlı olmasından dolayı, modeli tüm verilerle aynı anda beslemek imkansızdır. Bunun için, her seferinde bir grup veriyi beslemeniz gerekir. Milyonlarca veya daha fazla kayıt içeren devasa bir veri kümesinden bahsettiğimizi unutmayın. Toplu işlem eklemezseniz, bir bellek hatasıyla karşılaşırsınız.
Örneğin, verileriniz 100 gözlem içeriyorsa ve 10'luk bir toplu iş boyutu tanımlarsanız, bu, modelin her yineleme için 10 gözlem göreceği anlamına gelir (10 * 10).
Model tüm verileri gördüğünde, bir dönemi bitirir . Bir çağ, modelin verileri kaç kez görmesini istediğinizi tanımlar. Bu adımı sıfır olarak ayarlamak ve modelin yineleme sayısı gerçekleştirmesine izin vermek daha iyidir.
Eklenecek ikinci bir bilgi, her yinelemeden önce verileri karıştırmak istemenizdir. Eğitim sırasında, modelin veri setinin belirli modelini öğrenmemesi için verileri karıştırmak önemlidir. Model, verinin altında yatan modelin ayrıntılarını öğrenirse, görünmeyen veriler için öngörüyü genellemekte güçlük çekecektir. Buna aşırı uyum denir . Model, eğitim verileri üzerinde iyi performans gösteriyor ancak görünmeyen veriler için doğru tahmin yapamıyor.
TensorFlow, bu iki adımı kolaylaştırır. Veriler boru hattına gittiğinde, kaç gözleme ihtiyacı olduğunu (toplu olarak) ve verileri karıştırması gerekip gerekmediğini bilir.
Tensorflow'a modeli nasıl besleyeceğini öğretmek için pandas_input_fn'yi kullanabilirsiniz. Bu nesnenin 5 parametreye ihtiyacı vardır:
- x: özellik verileri
- y: etiket verisi
- batch_size: batch. Varsayılan olarak 128
- num_epoch: dönem sayısı, varsayılan olarak 1
- karıştır: Verileri karıştırın veya karıştırmayın. Varsayılan olarak, Yok
Modeli birçok kez beslemeniz gerekir, böylece bu işlemi tekrarlamak için bir işlev tanımlarsınız. tüm bu işlev get_input_fn.
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)
Bir modelin performansını değerlendirmenin genel yöntemi şudur:
- Modeli eğitin
- Modeli farklı bir veri kümesinde değerlendirin
- Tahmin etmek
Tensorflow tahmin aracı, bu üç adımı kolayca gerçekleştirmek için üç farklı işlev sunar.
Adım 4) : Modeli eğitin
Modeli değerlendirmek için tahminci trenini kullanabilirsiniz. Tren tahmin edicisinin bir input_fn'ye ve birkaç adıma ihtiyacı vardır. Modeli beslemek için yukarıda oluşturduğunuz işlevi kullanabilirsiniz. Ardından, modele 1000 kez yineleme yapması talimatını verirsiniz. Dönem sayısını belirtmezseniz, modelin 1000 kez yinelenmesine izin verirsiniz. Dönem sayısını 1 olarak ayarlarsanız, model 4 kez yinelenir: Eğitim setinde 400 kayıt vardır ve toplu iş boyutu 128'dir.
- 128 sıra
- 128 sıra
- 128 sıra
- 16 sıra
Bu nedenle, dönem sayısını hiçbiri olarak ayarlamak ve yineleme sayısını aşağıdaki TensorFlow sınıflandırma örneğinde gösterildiği gibi tanımlamak daha kolaydır.
estimator.train(input_fn=get_input_fn(training_set,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/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 238.616INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)INFO:tensorflow:global_step/sec: 314.293INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)INFO:tensorflow:global_step/sec: 303.863INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)INFO:tensorflow:global_step/sec: 308.782INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)INFO:tensorflow:global_step/sec: 244.969INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)INFO:tensorflow:global_step/sec: 155.966INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)INFO:tensorflow:global_step/sec: 263.256INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)INFO:tensorflow:global_step/sec: 254.112INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)INFO:tensorflow:global_step/sec: 292.405INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.INFO:tensorflow:Loss for final step: 5925.9873.
Tensorboard'un aşağıdaki komutu vereceğini kontrol edebilirsiniz:
activate hello-tf# For MacOStensorboard --logdir=./train# For Windowstensorboard --logdir=train
Adım 5) Modelinizi değerlendirin
Modelinizin test setine uyumunu aşağıdaki kod ile değerlendirebilirsiniz:
ev = estimator.evaluate(input_fn=get_input_fn(test_set,num_epochs=1,n_batch = 128,shuffle=False))
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
Kaybı aşağıdaki kodla yazdırabilirsiniz:
loss_score = ev["loss"]print("Loss: {0:f}".format(loss_score))
Çıktı
Loss: 3215.895996
Modelde 3215 kayıp var. Hatanın ne kadar büyük olduğu hakkında bir fikir edinmek için özet istatistiği kontrol edebilirsiniz.
training_set['medv'].describe()
Çıktı
count 400.000000mean 22.625500std 9.572593min 5.00000025% 16.60000050% 21.40000075% 25.025000max 50.000000Name: medv, dtype: float64
Yukarıdaki özet istatistikten bir evin ortalama fiyatının 22 bin, minimum 9 bin, maksimum 50 bin olduğunu biliyorsunuz. Model 3 bin dolarlık tipik bir hata yapıyor.
Adım 6) Tahminde bulunun
Son olarak, 6 Boston evinin değerini tahmin etmek için tahminci TensorFlow tahminini kullanabilirsiniz.
y = estimator.predict(input_fn=get_input_fn(prediction_set,num_epochs=1,n_batch = 128,shuffle=False))
Tahmini değerlerini yazdırmak için şu kodu kullanabilirsiniz:
predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]
Model aşağıdaki değerleri tahmin eder:
ev |
Tahmin | |
---|---|---|
1 |
32.29 | |
2 |
18.96 | |
3 |
27.27 | |
4 |
29.29 | |
5 |
16.43 | |
7 |
21.46 |
Bunun gerçek değerini bilmediğimizi unutmayın. Derin öğrenme eğitiminde, doğrusal modeli yenmeye çalışacaksınız.
Uyuşmuş Çözüm
Bu bölüm, verileri beslemek için bir uyuşuk tahminciyi kullanarak modelin nasıl eğitileceğini açıklar. Yöntem, numpy_input_fn tahmin edicisini kullanacağınızla aynıdır.
training_set_n = pd.read_csv ("E: /boston_train.csv"). değerler
test_set_n = pd.read_csv ("E: /boston_test.csv"). değerler
prediction_set_n = pd.read_csv ("E: /boston_predict.csv"). değerler
Adım 1) Verileri içe aktarın
Öncelikle, özellik değişkenlerini etiketten ayırt etmeniz gerekir. Eğitim verileri ve değerlendirmesi için bunu yapmanız gerekir. Verileri bölmek için bir işlev tanımlamak daha hızlıdır.
def prepare_data(df):X_train = df[:, :-3]y_train = df[:,-3]return X_train, y_train
İşlevi, etiketi eğit / veri kümesinin özelliklerinden ayırmak için kullanabilirsiniz.
X_train, y_train = prepare_data(training_set_n)X_test, y_test = prepare_data(test_set_n)
Tahmin veri kümesinin son sütununu hariç tutmanız gerekir çünkü yalnızca NaN içerir
x_predict = prediction_set_n[:, :-2]
Dizinin şeklini onaylayın. Etiketin bir boyutu olmaması gerektiğini unutmayın, bu (400,) anlamına gelir.
print(X_train.shape, y_train.shape, x_predict.shape)
Çıktı
(400, 9) (400,) (6, 9)
Özellik sütunlarını aşağıdaki gibi oluşturabilirsiniz:
feature_columns = [ tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]
Tahminci daha önce tanımlandığı gibi, özellik sütunlarına ve grafiğin nereye kaydedileceğine talimat verirsiniz.
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns,model_dir="train1")
Çıktı
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'train1', '_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}
Verileri modele beslemek ve ardından modeli eğitmek için uyuşuk tahminini kullanabilirsiniz. Okunabilirliği kolaylaştırmak için daha önce input_fn işlevini tanımladığımıza dikkat edin.
# Train the estimatortrain_input = tf.estimator.inputs.numpy_input_fn(x={"x": X_train},y=y_train,batch_size=128,shuffle=False,num_epochs=None)estimator.train(input_fn = train_input,steps=5000)
Çı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 train1/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 490.057INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)INFO:tensorflow:global_step/sec: 788.986INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)INFO:tensorflow:global_step/sec: 736.339INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)INFO:tensorflow:global_step/sec: 383.305INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)INFO:tensorflow:global_step/sec: 859.832INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)INFO:tensorflow:global_step/sec: 804.394INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)INFO:tensorflow:global_step/sec: 753.059INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)INFO:tensorflow:global_step/sec: 402.165INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)INFO:tensorflow:global_step/sec: 344.022INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.INFO:tensorflow:Loss for final step: 5925.985.Out[23]:
Modelinizi değerlendirmek için aynı adımı farklı bir tahminciyle tekrarlarsınız
eval_input = tf.estimator.inputs.numpy_input_fn(x={"x": X_test},y=y_test,shuffle=False,batch_size=128,num_epochs=1)estimator.evaluate(eval_input,steps=None)
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945Out[24]:{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}
Son olarak, tahmini hesaplayabilirsiniz. Pandalarla benzer olmalıdır.
test_input = tf.estimator.inputs.numpy_input_fn(x={"x": x_predict},batch_size=128,num_epochs=1,shuffle=False)y = estimator.predict(test_input)predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]
Tensorflow çözümü
Son bölüm bir TensorFlow çözümüne ayrılmıştır. Bu yöntem diğerinden biraz daha karmaşıktır.
Jupyter dizüstü bilgisayar kullanıyorsanız, bu oturumu çalıştırmak için çekirdeği yeniden başlatmanız ve temizlemeniz gerektiğini unutmayın.
TensorFlow, verileri ardışık düzene geçirmek için harika bir araç geliştirdi. Bu bölümde, input_fn işlevini kendiniz oluşturacaksınız.
Adım 1) Verinin yolunu ve biçimini tanımlayın
Öncelikle, csv dosyasının yolu ile iki değişken tanımlıyorsunuz. Biri eğitim seti ve diğeri test seti için olmak üzere iki dosyanız olduğunu unutmayın.
import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"
Ardından csv dosyasından kullanmak istediğiniz sütunları tanımlamanız gerekir. Hepsini kullanacağız. Bundan sonra, değişkenin türünü belirtmeniz gerekir.
Floats değişkeni [0] ile tanımlanır
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age","dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]
Adım 2) input_fn işlevini tanımlayın
İşlev üç bölüme ayrılabilir:
- Verileri içeri aktarın
- Yineleyiciyi oluşturun
- Verileri tüketin
Fonksiyonu tanımlamak için genel kod aşağıdadır. Kod sonra açıklanacak
def input_fn(data_file, batch_size, num_epoch = None):# Step 1def parse_csv(value):columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)features = dict(zip(COLUMNS, columns))#labels = features.pop('median_house_value')labels = features.pop('medv')return features, labels# Extract lines from input files using theDataset API. dataset = (tf.data.TextLineDataset(data_file) # Read text file.skip(1) # Skip header row.map(parse_csv))dataset = dataset.repeat(num_epoch)dataset = dataset.batch(batch_size)# Step 3iterator = dataset.make_one_shot_iterator()features, labels = iterator.get_next()return features, labels
** Verileri içe aktarın **
Bir csv dosyası için, veri kümesi yöntemi her seferinde bir satır okur. Veri kümesini oluşturmak için TextLineDataset nesnesini kullanmanız gerekir. Veri kümenizin bir başlığı vardır, bu nedenle ilk satırı atlamak için skip (1) kullanmanız gerekir. Bu noktada, yalnızca verileri okur ve başlığı ardışık düzen içinde hariç tutarsınız. Modeli beslemek için özellikleri etiketten ayırmanız gerekir. Verilere herhangi bir dönüşümü uygulamak için kullanılan yöntem haritadır.
Bu yöntem, verilerin nasıl dönüştürüleceğini öğretmek için oluşturacağınız bir işlevi çağırır.
- tf.data.TextLineDataset (data_file): Bu satır csv dosyasını okur
- .skip (1): başlığı atla
- .map (parse_csv)): kayıtları tensörlere ayrıştırın Harita nesnesine talimat vermek için bir işlev tanımlamanız gerekir. Bu işlevi parse_csv olarak adlandırabilirsiniz.
Bu işlev, csv dosyasını tf.decode_csv yöntemiyle ayrıştırır ve özellikleri ve etiketi bildirir. Özellikler bir sözlük veya bir demet olarak ilan edilebilir. Daha uygun olduğu için sözlük yöntemini kullanıyorsunuz.
- tf.decode_csv (değer, kayıt_defaults = RECORDS_ALL): decode_csv yöntemi, csv dosyasını okumak için TextLineDataset çıktısını kullanır. record_defaults, TensorFlow'a sütun türü hakkında talimat verir.
- dict (zip (_CSV_COLUMNS, sütunlar)): Sözlüğü bu veri işleme sırasında çıkarılan tüm sütunlarla doldurun
- features.pop ('median_house_value'): Hedef değişkeni özellik değişkeninden hariç tutun ve bir etiket değişkeni oluşturun
Veri Kümesi, Tensörleri yinelemeli olarak beslemek için daha fazla öğeye ihtiyaç duyar. Aslında, modeli beslemek için veri kümesinin süresiz olarak devam etmesine izin vermek için yöntem tekrarı eklemeniz gerekir. Yöntemi eklemezseniz, model yalnızca bir kez yineleme yapar ve ardından ardışık düzene daha fazla veri beslenmediğinden bir hata verir.
Bundan sonra, toplu iş yöntemiyle parti boyutunu kontrol edebilirsiniz. Bu, veri kümesine her yineleme için ardışık düzende kaç veriyi geçirmek istediğinizi söylediğiniz anlamına gelir. Büyük bir parti boyutu ayarlarsanız, model yavaş olacaktır.
Adım 3) Yineleyiciyi oluşturun
Artık ikinci adıma hazırsınız: veri kümesindeki öğeleri döndürmek için bir yineleyici oluşturun.
Bir operatör oluşturmanın en basit yolu make_one_shot_iterator yöntemidir.
Bundan sonra, yineleyiciden unsurları ve etiketleri oluşturabilirsiniz.
Adım 4) Verileri tüketin
İnput_fn işlevi ile ne olduğunu kontrol edebilirsiniz. Verileri tüketmek için bir oturumda işlevi çağırmanız gerekir. 1'e eşit bir parti boyutu ile deneyin.
Unutmayın, özellikleri bir sözlükte ve etiketi bir dizi olarak yazdırır.
Csv dosyasının ilk satırını gösterecektir. Bu kodu birçok kez farklı parti boyutu ile çalıştırmayı deneyebilirsiniz.
next_batch = input_fn(df_train, batch_size = 1, num_epoch = None)with tf.Session() as sess:first_batch = sess.run(next_batch)print(first_batch)
Çıktı
({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))
Adım 4) Özellik sütununu tanımlayın
Sayısal sütunları aşağıdaki gibi tanımlamanız gerekir:
X1= tf.feature_column.numeric_column('crim')X2= tf.feature_column.numeric_column('zn')X3= tf.feature_column.numeric_column('indus')X4= tf.feature_column.numeric_column('nox')X5= tf.feature_column.numeric_column('rm')X6= tf.feature_column.numeric_column('age')X7= tf.feature_column.numeric_column('dis')X8= tf.feature_column.numeric_column('tax')X9= tf.feature_column.numeric_column('ptratio')
Bir paketteki tüm değişkenleri birleştirmeniz gerektiğini unutmayın.
base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]
Adım 5) Modeli oluşturun
Modeli LinearRegressor kestirimci ile eğitebilirsiniz.
model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')
Çıktı
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'train3', '_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}
İnpu_fn işlevinde argümanı yazmanıza izin vermek için bir lambda işlevi kullanmanız gerekir. Lambda işlevi kullanmazsanız modeli eğitemezsiniz.
# Train the estimatormodel.train(steps =1000,input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))
Çı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 train3/model.ckpt.INFO:tensorflow:loss = 83729.64, step = 1INFO:tensorflow:global_step/sec: 72.5646INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)INFO:tensorflow:global_step/sec: 101.355INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)INFO:tensorflow:global_step/sec: 109.293INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)INFO:tensorflow:global_step/sec: 102.235INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)INFO:tensorflow:global_step/sec: 104.656INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)INFO:tensorflow:global_step/sec: 106.697INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)INFO:tensorflow:global_step/sec: 118.454INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)INFO:tensorflow:global_step/sec: 114.947INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)INFO:tensorflow:global_step/sec: 111.484INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.INFO:tensorflow:Loss for final step: 5925.9873.Out[8]:
Modelinizin test setine uyumunu aşağıdaki kod ile değerlendirebilirsiniz:
results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1))for key in results:print(" {}, was: {}".format(key, results[key]))
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896average_loss, was: 32.158958435058594loss, was: 3215.89599609375global_step, was: 1000
Son adım, özelliklerin matrislerinin değerine bağlı olarak değerini tahmin etmektir. Tahmin etmek istediğiniz değerlerle bir sözlük yazabilirsiniz. Modelinizin 9 özelliği vardır, bu nedenle her biri için bir değer sağlamanız gerekir. Model, her biri için bir tahmin sağlayacaktır.
Aşağıdaki kodda, df_predict csv dosyasında bulunan her bir özelliğin değerlerini yazdınız.
Veri kümesinde etiket olmadığı için yeni bir input_fn işlevi yazmanız gerekir. API from_tensor'ı Veri Kümesinden kullanabilirsiniz.
prediction_input = {'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],'zn': [75.0,0.0,25.0,33.0,0.0,0.0],'indus': [2.95,18.10,5.13,2.18,18.10,9.90],'nox': [0.428,0.713,0.453,0.472,0.700,0.544],'rm': [7.024,6.297,6.762,7.236,5.390,5.782],'age': [15.8,91.8,43.4,41.1,98.9,71.7],'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],'tax': [252,666,284,222,666,304],'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]}def test_input_fn():dataset = tf.data.Dataset.from_tensors(prediction_input)return dataset# Predict all our prediction_inputpred_results = model.predict(input_fn=test_input_fn)
Son olarak, tahminleri yazdırın.
for pred in enumerate(pred_results):print(pred)
Çıktı
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.(0, {'predictions': array([32.297546], dtype=float32)})(1, {'predictions': array([18.96125], dtype=float32)})(2, {'predictions': array([27.270979], dtype=float32)})(3, {'predictions': array([29.299236], dtype=float32)})(4, {'predictions': array([16.436684], dtype=float32)})(5, {'predictions': array([21.460876], dtype=float32)})INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})
Özet
Bir modeli eğitmek için yapmanız gerekenler:
- Özellikleri tanımlayın: Bağımsız değişkenler: X
- Etiketi tanımlayın: Bağımlı değişken: y
- Bir tren / test seti oluşturun
- Başlangıç ağırlığını tanımlayın
- Kayıp işlevini tanımlayın: MSE
- Modeli optimize edin: Gradyan inişi
- Tanımlamak:
- Öğrenme oranı
- Dönem sayısı
- Parti boyutu
Bu eğitimde, doğrusal regresyon TensorFlow tahmin aracı için yüksek seviyeli API'nin nasıl kullanılacağını öğrendiniz. Şunları tanımlamanız gerekir:
- Özellik sütunları. Sürekli ise: tf.feature_column.numeric_column (). Python liste anlama ile bir listeyi doldurabilirsiniz
- Tahminci: tf.estimator.LinearRegressor (feature_columns, model_dir)
- Verileri, toplu iş boyutunu ve dönemi içe aktarmak için bir işlev: input_fn ()
Bundan sonra train (), eval () ve tahmin () ile eğitmeye, değerlendirmeye ve tahmin yapmaya hazırsınız.