{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Ka|Ve 2019 Karmaşık Sistemler ve Veri Bilimi Yaz Okulu - Veri Bilimi Çalışması 1.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [ "kK_LfYMWfhs6", "pbR6Ddp7ei2Q", "cQfdEVf9eSAz" ] }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "gmPxVNd1NG60", "colab_type": "text" }, "source": [ "# Çalışma 1: Doğrusal Bağlanım\n", "\n", "Bu çalışmada, çeşitli araç modellerinin verilerini kullanarak, motor gücü ile yakıt sarfiyatı arasındaki ilişkiyi yakalayan bir model kuracağız." ] }, { "cell_type": "code", "metadata": { "id": "mbaqafnzNG64", "colab_type": "code", "colab": {} }, "source": [ "%matplotlib inline\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "FKylARbBNG7C", "colab_type": "text" }, "source": [ "Verimiz `Auto.csv` isimli bir dosyada CSV formatında [GitHub Gist'te](https://gist.github.com/mkozturk/34aefae02254b610184d1e4f26c8caf9) kayıtlı halde.\n", "\n", "`pandas` kütüphanesindeki fonksiyonlarla bu dosyayı internet üzerinden yükleyebiliriz." ] }, { "cell_type": "code", "metadata": { "id": "C86BPbvbNG7E", "colab_type": "code", "colab": {} }, "source": [ "data_url = \"https://gist.githubusercontent.com/mkozturk/34aefae02254b610184d1e4f26c8caf9/raw/d415f48a5e206166b621dca385a5b339b31ded75/Auto.csv\"\n", "data = pd.read_csv(data_url,sep=\",\", usecols=(0,3), na_values=\"?\").dropna()\n", "data.head()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "yvBV1A0tNG7P", "colab_type": "text" }, "source": [ "Grafiğini çizelim" ] }, { "cell_type": "code", "metadata": { "id": "7jVv7lKtNG7S", "colab_type": "code", "colab": {} }, "source": [ "hp = data[\"horsepower\"].values\n", "mpg = data[\"mpg\"].values\n", "plt.scatter(hp,mpg)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "G3WIGsFdNG7a", "colab_type": "text" }, "source": [ "Verinin düz bir çizgiye uymadığı belli, ama biz yine de deneyelim." ] }, { "cell_type": "code", "metadata": { "id": "zon9paf2NG7b", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.linear_model import LinearRegression\n", "from sklearn.metrics import r2_score\n", "\n", "linmodel = LinearRegression()\n", "linmodel.fit(hp.reshape(-1,1), mpg)\n", "\n", "r2_score(mpg, linmodel.predict(hp.reshape(-1,1)))" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "95_IQkZ8NG7i", "colab_type": "text" }, "source": [ "Modelden elde ettiğimiz eğriyi orijinal veriyle beraber çizelim." ] }, { "cell_type": "code", "metadata": { "id": "gvnoINWRNG7k", "colab_type": "code", "colab": {} }, "source": [ "x_fit = np.linspace(0,250)\n", "y_fit = linmodel.intercept_ + linmodel.coef_[0]*x_fit\n", "plt.plot(x_fit, y_fit,\"r\")\n", "plt.scatter(hp, mpg, alpha=0.5)\n", "plt.xlabel(\"horsepower\")\n", "plt.ylabel(\"mpg\");" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Dt-d9M7iNG7s", "colab_type": "text" }, "source": [ "## Polinom bağlanımı" ] }, { "cell_type": "markdown", "metadata": { "id": "N0MyqEEWNG7t", "colab_type": "text" }, "source": [ "Düz bir çizginin veriye iyi uymadığı belli. Bunun yerine, ikinci derece bir polinom modeli varsayalım.\n", "$$\\mathrm{mpg} = \\beta_0 + \\beta_1\\cdot\\mathrm{hp} + \\beta_2 \\cdot \\mathrm{hp}^2$$\n", "\n", "Bunun için $\\mathrm{hp}$ ve $\\mathrm{hp}^2$ değerlerini içeren iki sütunlu bir matris kurmalıyız." ] }, { "cell_type": "code", "metadata": { "id": "b7rrQ3BLNG7v", "colab_type": "code", "colab": {} }, "source": [ "deg2model = LinearRegression()\n", "deg2model.fit(np.c_[hp, hp**2], mpg)\n", "\n", "r2_score(mpg, deg2model.predict(np.c_[hp, hp**2]))" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "zpT7aqIUNG72", "colab_type": "text" }, "source": [ "Yine oluşturulan model eğrisiyle verinin grafiğini çizelim." ] }, { "cell_type": "code", "metadata": { "id": "UDnusbj2NG74", "colab_type": "code", "colab": {} }, "source": [ "x_fit = np.linspace(0,250)\n", "y_fit = deg2model.intercept_ + deg2model.coef_[0]*x_fit + deg2model.coef_[1]*x_fit**2\n", "plt.plot(x_fit, y_fit, \"r\")\n", "plt.scatter(hp, mpg, alpha=0.5)\n", "plt.xlabel(\"horsepower\")\n", "plt.ylabel(\"mpg\");" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "NK1I0B5xNG8A", "colab_type": "text" }, "source": [ "İkinci derece polinom daha iyi uyuyor. Üçüncü derece daha mı iyi uyar? Dördüncü derece? Onbeşinci derece?\n", "\n", "Her yeni kuvvet derecesi için veri matrisine yeni bir sütun eklememiz gerekir. Bu eklemeyi yukarıdaki gibi de yapabiliriz; ama scikit-learn bize daha zahmetsiz bir yol sunuyor:" ] }, { "cell_type": "code", "metadata": { "id": "vh3UGuVmNG8B", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.preprocessing import PolynomialFeatures\n", "\n", "derece = 2\n", "poly = PolynomialFeatures(degree = derece, include_bias=False)\n", "X = poly.fit_transform(hp.reshape(-1,1))\n", "X[:5,:] # ilk beş satırı göster" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "l8V8MPjrNG8H", "colab_type": "code", "colab": {} }, "source": [ "linreg = LinearRegression()\n", "linreg.fit(X, mpg)\n", "print(\"R^2 =\", r2_score(mpg, linreg.predict(X)))\n", "print(\"Sabit parametre =\", linreg.intercept_)\n", "print(\"Katsayılar =\", linreg.coef_)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "6URdqqLCNG8N", "colab_type": "text" }, "source": [ "## Çalışma" ] }, { "cell_type": "markdown", "metadata": { "id": "TwKa7K0PNG8P", "colab_type": "text" }, "source": [ "Polinom derecesi olarak 3-9 kullanarak modeli yedi kere daha tekrar eğitin. RMSE değeri en yüksek olan modelin derecesi kaç?\n", "\n", "Kod satırlarını kopyalayıp yeni bir hücreye yapıştırabilirsiniz, veya yukarıdaki hücreleri, `derece` değerini değiştirerek tekrar tekrar çalıştırabilirsiniz.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "kK_LfYMWfhs6", "colab_type": "text" }, "source": [ "### Çözüm" ] }, { "cell_type": "code", "metadata": { "id": "r9yWvpe9NG8R", "colab_type": "code", "colab": {} }, "source": [ "for derece in range(3,10):\n", " poly = PolynomialFeatures(degree = derece, include_bias=False)\n", " X = poly.fit_transform(hp.reshape(-1,1))\n", " linreg.fit(X, mpg)\n", " print(\"derece =\",derece,\"R^2 =\", r2_score(mpg, linreg.predict(X)))" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "TqyY83_QNG8W", "colab_type": "text" }, "source": [ "Altıncı derece polinomdaki RMSE değeri diğerlerinden az daha yüksek. Bu polinomu veriyle beraber çizelim." ] }, { "cell_type": "code", "metadata": { "id": "o58kw9A3NG8Z", "colab_type": "code", "colab": {} }, "source": [ "linreg = LinearRegression()\n", "poly = PolynomialFeatures(degree=6, include_bias=False)\n", "X = poly.fit_transform(hp.reshape(-1,1))\n", "\n", "linreg.fit(X, mpg)\n", "\n", "x_fit = np.linspace(0,250)\n", "y_fit = linreg.intercept_\n", "for i,coef in enumerate(linreg.coef_):\n", " y_fit += coef*x_fit**(i+1)\n", "\n", "plt.scatter(hp, mpg, alpha=0.5)\n", "plt.plot(x_fit, y_fit, \"r\")\n", "plt.xlabel(\"horsepower\")\n", "plt.ylabel(\"mpg\")\n", "plt.ylim([10,50]);" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "E30fRiUHNG8i", "colab_type": "text" }, "source": [ "Kırmızı çizgi veriye gayet iyi (fazla iyi!) uysa da, düşük beygir gücünde verimsizlik öngörme gibi bir garipliği var. Ayrıca, modelin henüz görmediğimiz verilerdeki performansının nasıl olacağını göz önüne almadık. Modelimiz _aşırı öğrenmiş_ olabilir." ] }, { "cell_type": "markdown", "metadata": { "id": "uBDXHCpgNG8j", "colab_type": "text" }, "source": [ "## Eğitme ve sınama kümeleri" ] }, { "cell_type": "markdown", "metadata": { "id": "QB436PgTNG8l", "colab_type": "text" }, "source": [ "Aşırı öğrenmeden kaçınmak için, önce orijinal veri kümesinden bazı noktaları **rastgele** olarak kenara ayırırız. Bu test kümesi en sonunda modelleri sınamak için kullanılacak." ] }, { "cell_type": "code", "metadata": { "id": "_kFC05XVNG8l", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.model_selection import train_test_split" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "rMXsV42UNG8q", "colab_type": "code", "colab": {} }, "source": [ "derece = 6\n", "poly = PolynomialFeatures(degree = derece, include_bias=False)\n", "X = poly.fit_transform(hp.reshape(-1,1))\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, mpg, random_state=11)\n", "\n", "linreg = LinearRegression()\n", "linreg.fit(X_train, y_train) # Eğitim kümesiyle eğit\n", "print(\"eğitim R^2 =\", r2_score(y_train, linreg.predict(X_train)))\n", "print(\"sınama R^2 =\", r2_score(y_test, linreg.predict(X_test))) # Sınama " ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "EOPI1XSONG8x", "colab_type": "text" }, "source": [ "Altıncı derece polinom modelin test kümesi başarısı, eğitim kümesi başarısından düşük. Bu, aşırı öğrenmeye tekabül ediyor.\n", "\n", "Eğitme-sınama kümeleri rastgele belirlendiği için, şansa bağlı olarak bu sayılar değişecektir (`random_state` parametre değeriyle oynayarak yeni değerler bulabilirsiniz). Bu yüzden _çapraz doğrulama_ (cross validation) yöntemleri kullanmak daha sağlam bir yaklaşımdır, ama buradaki zamanımız bu ayrıntıya girmeye elvermiyor." ] }, { "cell_type": "markdown", "metadata": { "id": "JMmQ4C8dNG8y", "colab_type": "text" }, "source": [ "## Çalışma\n", "Eğitim-sınama kümeleri ayırarak 2-9 arasındaki derecelerde polinom modelleri eğitin. Her polinom derecesi için eğitim kümesi ve test kümesi başarı puanlarını ayrı ayrı hesaplayın. Bu puanlara bakarak, hangi modeli kullanmayı tercih edersiniz?\n", "\n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "pbR6Ddp7ei2Q", "colab_type": "text" }, "source": [ "###Çözüm" ] }, { "cell_type": "code", "metadata": { "id": "vKDEVL_tNG80", "colab_type": "code", "colab": {} }, "source": [ "for derece in range(2,10):\n", " poly = PolynomialFeatures(degree = derece, include_bias=False)\n", " X = poly.fit_transform(hp.reshape(-1,1))\n", "\n", " X_train, X_test, y_train, y_test = train_test_split(X, mpg, random_state=11)\n", "\n", " linreg = LinearRegression()\n", " linreg.fit(X_train, y_train) # Eğitim kümesiyle eğit\n", " print(\"derece = {}, eğitim R^2 = {:.3f}, sınama R^2 = {:.3f}\".format(\n", " derece,\n", " r2_score(y_train, linreg.predict(X_train)),\n", " r2_score(y_test, linreg.predict(X_test)))\n", " )" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ElvzfwlLPbaQ", "colab_type": "text" }, "source": [ "# Çalışma 2: Sınıflandırma\n", "\n", "Bu kısımda bir sınıflandırma algoritması eğiteceğiz. Klasik \"iris\" (süsen) veri kümesini ve k-NN algoritmasını kullanacağız.\n", "\n", "Bu veri kümesinin yapısını görmek için `seaborn` kütüphanesinin `pairplot` fonksiyonunu kullanabiliriz." ] }, { "cell_type": "code", "metadata": { "id": "uDevhcX5fCSa", "colab_type": "code", "colab": {} }, "source": [ "%matplotlib inline\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MHRLSBMkQPr9", "colab_type": "code", "colab": {} }, "source": [ "import seaborn as sns\n", "iris = sns.load_dataset(\"iris\")\n", "sns.pairplot(iris, hue=\"species\")" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "xSSMcflrT2Ts", "colab_type": "code", "colab": {} }, "source": [ "iris.head()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "7-xvqtwbYqEa", "colab_type": "text" }, "source": [ "Aynı veri kümesi `scikit-learn` paketinde de mevcut. Oradan yükleyip eğitim ve sınama kümeleri hazırlayalım." ] }, { "cell_type": "code", "metadata": { "id": "UzDEvVCjQZ3m", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.datasets import load_iris\n", "iris = load_iris()\n", "\n", "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(iris[\"data\"], iris[\"target\"], random_state=121324)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "5s9vdad5ZJUS", "colab_type": "text" }, "source": [ "En yakın üç komşuyla kNN modeli oluşturalım ve eğitim kümesiyle eğitelim." ] }, { "cell_type": "code", "metadata": { "id": "PHSooEfZQs6o", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.neighbors import KNeighborsClassifier\n", "knn = KNeighborsClassifier(n_neighbors = 3)\n", "knn.fit(X_train, y_train);" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ojx8r3mtZVvR", "colab_type": "text" }, "source": [ "Sınama kümesini kullanarak tahmin yapalım." ] }, { "cell_type": "code", "metadata": { "id": "yC94vWqDQwy0", "colab_type": "code", "colab": {} }, "source": [ "knn.predict(X_test)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "AFo0k_p4Zk0B", "colab_type": "text" }, "source": [ "Gerçek sonuçlarla karşılaştırarak, sınama kümesindeki başarı oranını çıkaralım." ] }, { "cell_type": "code", "metadata": { "id": "l59CbxGXQ67P", "colab_type": "code", "colab": {} }, "source": [ "np.mean(knn.predict(X_test)==y_test)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "hmuQ79nvcDzm", "colab_type": "text" }, "source": [ "Eğitim kümesindeki başarı oranı:" ] }, { "cell_type": "code", "metadata": { "id": "0EQwm2JscLVm", "colab_type": "code", "colab": {} }, "source": [ "np.mean(knn.predict(X_train)==y_train)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "rV0nRHxyRkiy", "colab_type": "text" }, "source": [ "## Çalışma\n", "\n", "Veri kümesini eğitim ve sınama kümelerine ayırın. k-NN algoritmasını 1-10 arasında sayıda komşular kullanarak eğitin. Her model (komşu sayısı) için eğitim kümesi başarı oranını ve sınama kümesi başarı oranını kaydedin. Kaç komşu kullanmak sizce en uygundur?\n", "\n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "cQfdEVf9eSAz", "colab_type": "text" }, "source": [ "### Çözüm" ] }, { "cell_type": "code", "metadata": { "id": "wFzuDAdgRm7Q", "colab_type": "code", "colab": {} }, "source": [ "train_scores = []\n", "test_scores = []\n", "X_train, X_test, y_train, y_test = train_test_split(iris[\"data\"], iris[\"target\"], random_state=76845)\n", "for k in range(1,20):\n", " knn = KNeighborsClassifier(n_neighbors = k)\n", " knn.fit(X_train, y_train)\n", " train_scores.append( knn.score(X_train, y_train))\n", " test_scores.append( knn.score(X_test, y_test))\n", "\n", "plt.plot(range(1,20), train_scores, range(1,20),test_scores)\n", "plt.legend([\"Training\",\"Testing\"])\n", "plt.ylabel(\"Accuracy score\")\n", "plt.xlabel(\"k\");" ], "execution_count": 0, "outputs": [] } ] }