From 6343af60dec5e00a9b480122bbaf4a04da8f4e26 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Thu, 28 Jan 2021 18:36:33 +0200 Subject: [PATCH 01/21] Add files via upload --- tasks/artembielov_task1/model_v3.ipynb | 977 +++++++++++++++++++++++++ tasks/artembielov_task1/model_v3.py | 58 ++ 2 files changed, 1035 insertions(+) create mode 100644 tasks/artembielov_task1/model_v3.ipynb create mode 100644 tasks/artembielov_task1/model_v3.py diff --git a/tasks/artembielov_task1/model_v3.ipynb b/tasks/artembielov_task1/model_v3.ipynb new file mode 100644 index 0000000..47ec728 --- /dev/null +++ b/tasks/artembielov_task1/model_v3.ipynb @@ -0,0 +1,977 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "test = pd.read_csv(\"data/test.csv\")\n", + "train = pd.read_csv(\"data/train.csv\")\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fix skewness(log)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "target = np.log(train.SalePrice) \n" + ] + }, + { + "cell_type": "heading", + "metadata": { + "collapsed": false + }, + "level": 1, + "source": [ + "Explore correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "numeric_features = train.select_dtypes(include=[np.number])\n", + "print(numeric_features.dtypes)\n", + "\n", + "corr = numeric_features.corr()\n", + "print(corr['SalePrice'].sort_values(ascending=False)[:5], '\\n')\n", + "print(corr['SalePrice'].sort_values(ascending=False)[-5:])\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Explore null data" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Null Count\nFeature \nPoolQC 1453\nMiscFeature 1406\nAlley 1369\nFence 1179\nFireplaceQu 690\nLotFrontage 259\nGarageYrBlt 81\nGarageCond 81\nGarageType 81\nGarageFinish 81\nGarageQual 81\nBsmtFinType2 38\nBsmtExposure 38\nBsmtQual 37\nBsmtCond 37\nBsmtFinType1 37\nMasVnrArea 8\nMasVnrType 8\nElectrical 1\nId 0\nFunctional 0\nFireplaces 0\nKitchenQual 0\nKitchenAbvGr 0\nBedroomAbvGr 0\n" + ] + } + ], + "source": [ + "nulls = pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])\n", + "nulls.columns = ['Null Count']\n", + "nulls.index.name = 'Feature'\n", + "print(nulls)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Drop useless data" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition']))\n", + "\n", + "all_data = all_data.drop(['Utilities'], axis=1)\n", + "\n", + "useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence']\n", + "all_data.drop(useless, axis=1)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Using one-hot encoding to engineer fetures: 'Street', 'SaleCondition'" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "'Street'" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original: \n\nPave 2907\nGrvl 12\nName: Street, dtype: int64 \n\nEncoded: \n\n1 2907\n0 12\nName: enc_street, dtype: int64\n" + ] + } + ], + "source": [ + "print(\"Original: \\n\")\n", + "print(all_data.Street.value_counts(), \"\\n\")\n", + "\n", + "\n", + "def encode(x):\n", + " return 1 if x == 'Partial' else 0\n", + "\n", + "\n", + "all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True)\n", + "all_data['enc_condition'] = all_data.SaleCondition.apply(encode)\n", + "\n", + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print ('Encoded: \\n')\n", + "print (all_data.enc_street.value_counts())\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Remove null-data" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + } + ], + "source": [ + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print(sum(data_train.isnull().sum() != 0)) \n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Linear model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", + "from sklearn.neural_network import MLPRegressor\n", + "from sklearn.linear_model import Ridge\n", + "from sklearn.linear_model import LinearRegression\n", + "from mlxtend.regressor import StackingRegressor\n", + "\n", + "\n", + "X_train = data_train\n", + "X_test = data_test\n", + "y = target\n", + "\n", + "lr = LinearRegression(n_jobs=-1)\n", + "rd = Ridge(alpha=4.84)\n", + "rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1)\n", + "gb = GradientBoostingRegressor(n_estimators=40, max_depth=2)\n", + "nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "\n", + "Initialize linear regression model" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fit model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.fit(X_train, y)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Make a submission" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "ename": "NotFittedError", + "evalue": "This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mY_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfinal_predictions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\regressor\\stacking_regression.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mPredicted\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \"\"\"\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_is_fitted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'regr_'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0mmeta_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_meta_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\externals\\estimator_checks.py\u001b[0m in \u001b[0;36mcheck_is_fitted\u001b[0;34m(estimator, attributes, msg, all_or_any)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mall_or_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mattr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mattributes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFittedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method." + ], + "output_type": "error" + } + ], + "source": [ + "y_pred = model.predict(X_train)\n", + "\n", + "Y_pred = model.predict(X_test)\n", + "\n", + "final_predictions = np.exp(Y_pred)\n", + "submission = pd.DataFrame()\n", + "submission['Id'] = test['Id']\n", + "submission['SalePrice'] = final_predictions\n", + "submission.to_csv('submission_v3.csv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tasks/artembielov_task1/model_v3.py b/tasks/artembielov_task1/model_v3.py new file mode 100644 index 0000000..4cfeb1a --- /dev/null +++ b/tasks/artembielov_task1/model_v3.py @@ -0,0 +1,58 @@ +import pandas as pd +import numpy as np +from sklearn.ensemble import RandomForestRegressor +from sklearn.ensemble import GradientBoostingRegressor +from sklearn.neural_network import MLPRegressor +from sklearn.linear_model import Ridge +from sklearn.linear_model import LinearRegression +from mlxtend.regressor import StackingRegressor + + +path = 'D:/projects/Python/Samsung2/House price/data/' +test = pd.read_csv(path + 'test.csv') +train = pd.read_csv(path + 'train.csv') + +target = np.log(train.SalePrice) + + +all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition'])) + +all_data = all_data.drop(['Utilities'], axis=1) + +useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence'] +all_data.drop(useless, axis=1) + + +def encode(x): + return 1 if x == 'Partial' else 0 + + +all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True) +all_data['enc_condition'] = all_data.SaleCondition.apply(encode) + +data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna() +data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna() + +X_train = data_train +X_test = data_test +y = target + +lr = LinearRegression(n_jobs=-1) +rd = Ridge(alpha=4.84) +rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1) +gb = GradientBoostingRegressor(n_estimators=40, max_depth=2) +nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75) + +model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr) + +model.fit(X_train, y) + +y_pred = model.predict(X_train) + +Y_pred = model.predict(X_test) + +final_predictions = np.exp(Y_pred) +submission = pd.DataFrame() +submission['Id'] = test['Id'] +submission['SalePrice'] = final_predictions +submission.to_csv('submission_v3.csv', index=False) From 1e46e00d6c50f695799b192f0c82775353617a8a Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Thu, 28 Jan 2021 19:10:42 +0200 Subject: [PATCH 02/21] Delete tasks/artembielov_task1 directory --- tasks/artembielov_task1/model_v3.ipynb | 977 ------------------------- tasks/artembielov_task1/model_v3.py | 58 -- 2 files changed, 1035 deletions(-) delete mode 100644 tasks/artembielov_task1/model_v3.ipynb delete mode 100644 tasks/artembielov_task1/model_v3.py diff --git a/tasks/artembielov_task1/model_v3.ipynb b/tasks/artembielov_task1/model_v3.ipynb deleted file mode 100644 index 47ec728..0000000 --- a/tasks/artembielov_task1/model_v3.ipynb +++ /dev/null @@ -1,977 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "test = pd.read_csv(\"data/test.csv\")\n", - "train = pd.read_csv(\"data/train.csv\")\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Fix skewness(log)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" - ] - } - ], - "source": [ - "\n", - "target = np.log(train.SalePrice) \n" - ] - }, - { - "cell_type": "heading", - "metadata": { - "collapsed": false - }, - "level": 1, - "source": [ - "Explore correlations" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" - ] - } - ], - "source": [ - "\n", - "numeric_features = train.select_dtypes(include=[np.number])\n", - "print(numeric_features.dtypes)\n", - "\n", - "corr = numeric_features.corr()\n", - "print(corr['SalePrice'].sort_values(ascending=False)[:5], '\\n')\n", - "print(corr['SalePrice'].sort_values(ascending=False)[-5:])\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Explore null data" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Null Count\nFeature \nPoolQC 1453\nMiscFeature 1406\nAlley 1369\nFence 1179\nFireplaceQu 690\nLotFrontage 259\nGarageYrBlt 81\nGarageCond 81\nGarageType 81\nGarageFinish 81\nGarageQual 81\nBsmtFinType2 38\nBsmtExposure 38\nBsmtQual 37\nBsmtCond 37\nBsmtFinType1 37\nMasVnrArea 8\nMasVnrType 8\nElectrical 1\nId 0\nFunctional 0\nFireplaces 0\nKitchenQual 0\nKitchenAbvGr 0\nBedroomAbvGr 0\n" - ] - } - ], - "source": [ - "nulls = pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])\n", - "nulls.columns = ['Null Count']\n", - "nulls.index.name = 'Feature'\n", - "print(nulls)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Drop useless data" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", - "

2919 rows × 74 columns

\n", - "
" - ], - "text/plain": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", - "

2919 rows × 74 columns

\n", - "
" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition']))\n", - "\n", - "all_data = all_data.drop(['Utilities'], axis=1)\n", - "\n", - "useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence']\n", - "all_data.drop(useless, axis=1)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Using one-hot encoding to engineer fetures: 'Street', 'SaleCondition'" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "'Street'" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original: \n\nPave 2907\nGrvl 12\nName: Street, dtype: int64 \n\nEncoded: \n\n1 2907\n0 12\nName: enc_street, dtype: int64\n" - ] - } - ], - "source": [ - "print(\"Original: \\n\")\n", - "print(all_data.Street.value_counts(), \"\\n\")\n", - "\n", - "\n", - "def encode(x):\n", - " return 1 if x == 'Partial' else 0\n", - "\n", - "\n", - "all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True)\n", - "all_data['enc_condition'] = all_data.SaleCondition.apply(encode)\n", - "\n", - "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "\n", - "print ('Encoded: \\n')\n", - "print (all_data.enc_street.value_counts())\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Remove null-data" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], - "source": [ - "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "\n", - "print(sum(data_train.isnull().sum() != 0)) \n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Linear model" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.ensemble import GradientBoostingRegressor\n", - "from sklearn.neural_network import MLPRegressor\n", - "from sklearn.linear_model import Ridge\n", - "from sklearn.linear_model import LinearRegression\n", - "from mlxtend.regressor import StackingRegressor\n", - "\n", - "\n", - "X_train = data_train\n", - "X_test = data_test\n", - "y = target\n", - "\n", - "lr = LinearRegression(n_jobs=-1)\n", - "rd = Ridge(alpha=4.84)\n", - "rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1)\n", - "gb = GradientBoostingRegressor(n_estimators=40, max_depth=2)\n", - "nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "\n", - "Initialize linear regression model" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Fit model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.fit(X_train, y)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Make a submission" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "ename": "NotFittedError", - "evalue": "This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNotFittedError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mY_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfinal_predictions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\regressor\\stacking_regression.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mPredicted\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \"\"\"\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_is_fitted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'regr_'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0mmeta_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_meta_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\externals\\estimator_checks.py\u001b[0m in \u001b[0;36mcheck_is_fitted\u001b[0;34m(estimator, attributes, msg, all_or_any)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mall_or_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mattr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mattributes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFittedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNotFittedError\u001b[0m: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method." - ], - "output_type": "error" - } - ], - "source": [ - "y_pred = model.predict(X_train)\n", - "\n", - "Y_pred = model.predict(X_test)\n", - "\n", - "final_predictions = np.exp(Y_pred)\n", - "submission = pd.DataFrame()\n", - "submission['Id'] = test['Id']\n", - "submission['SalePrice'] = final_predictions\n", - "submission.to_csv('submission_v3.csv', index=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/tasks/artembielov_task1/model_v3.py b/tasks/artembielov_task1/model_v3.py deleted file mode 100644 index 4cfeb1a..0000000 --- a/tasks/artembielov_task1/model_v3.py +++ /dev/null @@ -1,58 +0,0 @@ -import pandas as pd -import numpy as np -from sklearn.ensemble import RandomForestRegressor -from sklearn.ensemble import GradientBoostingRegressor -from sklearn.neural_network import MLPRegressor -from sklearn.linear_model import Ridge -from sklearn.linear_model import LinearRegression -from mlxtend.regressor import StackingRegressor - - -path = 'D:/projects/Python/Samsung2/House price/data/' -test = pd.read_csv(path + 'test.csv') -train = pd.read_csv(path + 'train.csv') - -target = np.log(train.SalePrice) - - -all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition'])) - -all_data = all_data.drop(['Utilities'], axis=1) - -useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence'] -all_data.drop(useless, axis=1) - - -def encode(x): - return 1 if x == 'Partial' else 0 - - -all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True) -all_data['enc_condition'] = all_data.SaleCondition.apply(encode) - -data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna() -data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna() - -X_train = data_train -X_test = data_test -y = target - -lr = LinearRegression(n_jobs=-1) -rd = Ridge(alpha=4.84) -rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1) -gb = GradientBoostingRegressor(n_estimators=40, max_depth=2) -nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75) - -model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr) - -model.fit(X_train, y) - -y_pred = model.predict(X_train) - -Y_pred = model.predict(X_test) - -final_predictions = np.exp(Y_pred) -submission = pd.DataFrame() -submission['Id'] = test['Id'] -submission['SalePrice'] = final_predictions -submission.to_csv('submission_v3.csv', index=False) From f610a9cc04f07af4fa9fbace6528ba91d4bf319c Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Thu, 28 Jan 2021 19:12:00 +0200 Subject: [PATCH 03/21] Add files via upload --- .../House price/model_v3.ipynb | 977 ++++++++++++++++++ .../artembielov_task1/House price/model_v3.py | 58 ++ .../artembielov_task1/Titanic/model_v1.ipynb | 693 +++++++++++++ tasks/artembielov_task1/Titanic/model_v1.py | 21 + 4 files changed, 1749 insertions(+) create mode 100644 tasks/artembielov_task1/House price/model_v3.ipynb create mode 100644 tasks/artembielov_task1/House price/model_v3.py create mode 100644 tasks/artembielov_task1/Titanic/model_v1.ipynb create mode 100644 tasks/artembielov_task1/Titanic/model_v1.py diff --git a/tasks/artembielov_task1/House price/model_v3.ipynb b/tasks/artembielov_task1/House price/model_v3.ipynb new file mode 100644 index 0000000..47ec728 --- /dev/null +++ b/tasks/artembielov_task1/House price/model_v3.ipynb @@ -0,0 +1,977 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "test = pd.read_csv(\"data/test.csv\")\n", + "train = pd.read_csv(\"data/train.csv\")\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fix skewness(log)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "target = np.log(train.SalePrice) \n" + ] + }, + { + "cell_type": "heading", + "metadata": { + "collapsed": false + }, + "level": 1, + "source": [ + "Explore correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "numeric_features = train.select_dtypes(include=[np.number])\n", + "print(numeric_features.dtypes)\n", + "\n", + "corr = numeric_features.corr()\n", + "print(corr['SalePrice'].sort_values(ascending=False)[:5], '\\n')\n", + "print(corr['SalePrice'].sort_values(ascending=False)[-5:])\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Explore null data" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Null Count\nFeature \nPoolQC 1453\nMiscFeature 1406\nAlley 1369\nFence 1179\nFireplaceQu 690\nLotFrontage 259\nGarageYrBlt 81\nGarageCond 81\nGarageType 81\nGarageFinish 81\nGarageQual 81\nBsmtFinType2 38\nBsmtExposure 38\nBsmtQual 37\nBsmtCond 37\nBsmtFinType1 37\nMasVnrArea 8\nMasVnrType 8\nElectrical 1\nId 0\nFunctional 0\nFireplaces 0\nKitchenQual 0\nKitchenAbvGr 0\nBedroomAbvGr 0\n" + ] + } + ], + "source": [ + "nulls = pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])\n", + "nulls.columns = ['Null Count']\n", + "nulls.index.name = 'Feature'\n", + "print(nulls)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Drop useless data" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition']))\n", + "\n", + "all_data = all_data.drop(['Utilities'], axis=1)\n", + "\n", + "useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence']\n", + "all_data.drop(useless, axis=1)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Using one-hot encoding to engineer fetures: 'Street', 'SaleCondition'" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "'Street'" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original: \n\nPave 2907\nGrvl 12\nName: Street, dtype: int64 \n\nEncoded: \n\n1 2907\n0 12\nName: enc_street, dtype: int64\n" + ] + } + ], + "source": [ + "print(\"Original: \\n\")\n", + "print(all_data.Street.value_counts(), \"\\n\")\n", + "\n", + "\n", + "def encode(x):\n", + " return 1 if x == 'Partial' else 0\n", + "\n", + "\n", + "all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True)\n", + "all_data['enc_condition'] = all_data.SaleCondition.apply(encode)\n", + "\n", + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print ('Encoded: \\n')\n", + "print (all_data.enc_street.value_counts())\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Remove null-data" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + } + ], + "source": [ + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print(sum(data_train.isnull().sum() != 0)) \n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Linear model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", + "from sklearn.neural_network import MLPRegressor\n", + "from sklearn.linear_model import Ridge\n", + "from sklearn.linear_model import LinearRegression\n", + "from mlxtend.regressor import StackingRegressor\n", + "\n", + "\n", + "X_train = data_train\n", + "X_test = data_test\n", + "y = target\n", + "\n", + "lr = LinearRegression(n_jobs=-1)\n", + "rd = Ridge(alpha=4.84)\n", + "rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1)\n", + "gb = GradientBoostingRegressor(n_estimators=40, max_depth=2)\n", + "nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "\n", + "Initialize linear regression model" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fit model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.fit(X_train, y)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Make a submission" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "ename": "NotFittedError", + "evalue": "This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mY_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfinal_predictions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\regressor\\stacking_regression.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mPredicted\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \"\"\"\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_is_fitted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'regr_'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0mmeta_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_meta_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\externals\\estimator_checks.py\u001b[0m in \u001b[0;36mcheck_is_fitted\u001b[0;34m(estimator, attributes, msg, all_or_any)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mall_or_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mattr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mattributes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFittedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method." + ], + "output_type": "error" + } + ], + "source": [ + "y_pred = model.predict(X_train)\n", + "\n", + "Y_pred = model.predict(X_test)\n", + "\n", + "final_predictions = np.exp(Y_pred)\n", + "submission = pd.DataFrame()\n", + "submission['Id'] = test['Id']\n", + "submission['SalePrice'] = final_predictions\n", + "submission.to_csv('submission_v3.csv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tasks/artembielov_task1/House price/model_v3.py b/tasks/artembielov_task1/House price/model_v3.py new file mode 100644 index 0000000..4cfeb1a --- /dev/null +++ b/tasks/artembielov_task1/House price/model_v3.py @@ -0,0 +1,58 @@ +import pandas as pd +import numpy as np +from sklearn.ensemble import RandomForestRegressor +from sklearn.ensemble import GradientBoostingRegressor +from sklearn.neural_network import MLPRegressor +from sklearn.linear_model import Ridge +from sklearn.linear_model import LinearRegression +from mlxtend.regressor import StackingRegressor + + +path = 'D:/projects/Python/Samsung2/House price/data/' +test = pd.read_csv(path + 'test.csv') +train = pd.read_csv(path + 'train.csv') + +target = np.log(train.SalePrice) + + +all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition'])) + +all_data = all_data.drop(['Utilities'], axis=1) + +useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence'] +all_data.drop(useless, axis=1) + + +def encode(x): + return 1 if x == 'Partial' else 0 + + +all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True) +all_data['enc_condition'] = all_data.SaleCondition.apply(encode) + +data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna() +data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna() + +X_train = data_train +X_test = data_test +y = target + +lr = LinearRegression(n_jobs=-1) +rd = Ridge(alpha=4.84) +rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1) +gb = GradientBoostingRegressor(n_estimators=40, max_depth=2) +nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75) + +model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr) + +model.fit(X_train, y) + +y_pred = model.predict(X_train) + +Y_pred = model.predict(X_test) + +final_predictions = np.exp(Y_pred) +submission = pd.DataFrame() +submission['Id'] = test['Id'] +submission['SalePrice'] = final_predictions +submission.to_csv('submission_v3.csv', index=False) diff --git a/tasks/artembielov_task1/Titanic/model_v1.ipynb b/tasks/artembielov_task1/Titanic/model_v1.ipynb new file mode 100644 index 0000000..0fb309c --- /dev/null +++ b/tasks/artembielov_task1/Titanic/model_v1.ipynb @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", + "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.651550Z", + "iopub.status.busy": "2021-01-25T14:39:05.650747Z", + "iopub.status.idle": "2021-01-25T14:39:05.656260Z", + "shell.execute_reply": "2021-01-25T14:39:05.655743Z" + }, + "papermill": { + "duration": 0.018492, + "end_time": "2021-01-25T14:39:05.656405", + "exception": false, + "start_time": "2021-01-25T14:39:05.637913", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd \n", + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "\n", + "path = 'D:/projects/Python/Samsung2/Titanic/data/'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.674687Z", + "iopub.status.busy": "2021-01-25T14:39:05.673983Z", + "iopub.status.idle": "2021-01-25T14:39:05.716139Z", + "shell.execute_reply": "2021-01-25T14:39:05.715681Z" + }, + "papermill": { + "duration": 0.053652, + "end_time": "2021-01-25T14:39:05.716241", + "exception": false, + "start_time": "2021-01-25T14:39:05.662589", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_data = pd.read_csv(path + \"train.csv\")\n", + "train_data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.740555Z", + "iopub.status.busy": "2021-01-25T14:39:05.735599Z", + "iopub.status.idle": "2021-01-25T14:39:05.755816Z", + "shell.execute_reply": "2021-01-25T14:39:05.756321Z" + }, + "papermill": { + "duration": 0.032416, + "end_time": "2021-01-25T14:39:05.756473", + "exception": false, + "start_time": "2021-01-25T14:39:05.724057", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", + "
" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_data = pd.read_csv(path + \"test.csv\")\n", + "test_data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.777922Z", + "iopub.status.busy": "2021-01-25T14:39:05.777250Z", + "iopub.status.idle": "2021-01-25T14:39:05.781165Z", + "shell.execute_reply": "2021-01-25T14:39:05.781695Z" + }, + "papermill": { + "duration": 0.018524, + "end_time": "2021-01-25T14:39:05.781858", + "exception": false, + "start_time": "2021-01-25T14:39:05.763334", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% of women who survived: 0.7420382165605095\n" + ] + } + ], + "source": [ + "women = train_data.loc[train_data.Sex == 'female'][\"Survived\"]\n", + "rate_women = sum(women)/len(women)\n", + "\n", + "print(\"% of women who survived:\", rate_women)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.803850Z", + "iopub.status.busy": "2021-01-25T14:39:05.803169Z", + "iopub.status.idle": "2021-01-25T14:39:05.807022Z", + "shell.execute_reply": "2021-01-25T14:39:05.807547Z" + }, + "papermill": { + "duration": 0.01846, + "end_time": "2021-01-25T14:39:05.807679", + "exception": false, + "start_time": "2021-01-25T14:39:05.789219", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% of men who survived: 0.18890814558058924\n" + ] + } + ], + "source": [ + "men = train_data.loc[train_data.Sex == 'male'][\"Survived\"]\n", + "rate_men = sum(men)/len(men)\n", + "\n", + "print(\"% of men who survived:\", rate_men)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.831772Z", + "iopub.status.busy": "2021-01-25T14:39:05.831113Z", + "iopub.status.idle": "2021-01-25T14:39:07.616680Z", + "shell.execute_reply": "2021-01-25T14:39:07.616040Z" + }, + "papermill": { + "duration": 1.80116, + "end_time": "2021-01-25T14:39:07.616814", + "exception": false, + "start_time": "2021-01-25T14:39:05.815654", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your submission was successfully saved!\n" + ] + } + ], + "source": [ + "y = train_data[\"Survived\"]\n", + "\n", + "features = [\"Pclass\", \"Sex\", \"SibSp\", \"Parch\"]\n", + "X = pd.get_dummies(train_data[features])\n", + "X_test = pd.get_dummies(test_data[features])\n", + "\n", + "model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)\n", + "model.fit(X, y)\n", + "predictions = model.predict(X_test)\n", + "\n", + "output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})\n", + "output.to_csv('my_submission.csv', index=False)\n", + "print(\"Your submission was successfully saved!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6" + }, + "papermill": { + "duration": 6.81406, + "end_time": "2021-01-25T14:39:07.733035", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2021-01-25T14:39:00.918975", + "version": "2.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tasks/artembielov_task1/Titanic/model_v1.py b/tasks/artembielov_task1/Titanic/model_v1.py new file mode 100644 index 0000000..bfd0f87 --- /dev/null +++ b/tasks/artembielov_task1/Titanic/model_v1.py @@ -0,0 +1,21 @@ +import pandas as pd +from sklearn.ensemble import RandomForestClassifier + + +path = 'D:/projects/Python/Samsung2/Titanic/data/' + +train_data = pd.read_csv(path + "train.csv") +test_data = pd.read_csv(path + "test.csv") + +y = train_data["Survived"] + +features = ["Pclass", "Sex", "SibSp", "Parch"] +X = pd.get_dummies(train_data[features]) +X_test = pd.get_dummies(test_data[features]) + +model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) +model.fit(X, y) +predictions = model.predict(X_test) + +output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions}) +output.to_csv('my_submission.csv', index=False) From 61a35cdc8f41a0da70b2dbef0d850970fa3738ec Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 2 Feb 2021 20:03:54 +0200 Subject: [PATCH 04/21] Add files via upload Metrics in 'metrics.txt --- tasks/artembielov_task2/Mask.py | 94 ++++++++++++++++++++++ tasks/artembielov_task2/metrics.txt | 120 ++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 tasks/artembielov_task2/Mask.py create mode 100644 tasks/artembielov_task2/metrics.txt diff --git a/tasks/artembielov_task2/Mask.py b/tasks/artembielov_task2/Mask.py new file mode 100644 index 0000000..2bbc09c --- /dev/null +++ b/tasks/artembielov_task2/Mask.py @@ -0,0 +1,94 @@ +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 180 +img_width = 180 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', + batch_size=batch_size, + image_size=(img_height,img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', + batch_size=batch_size, + image_size=(img_height,img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + + +def normalize(image, label): + image = tf.cast(image/255., tf.float32) + return image, label + + +class_names = ds_train.class_names +ds_train = ds_train.map(normalize) +ds_val = ds_val.map(normalize) + +AUTOTUNE = tf.data.AUTOTUNE + +ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait = True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, + epochs=10, + validation_data=ds_val, + callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, + epochs=10, + validation_data=ds_val) diff --git a/tasks/artembielov_task2/metrics.txt b/tasks/artembielov_task2/metrics.txt new file mode 100644 index 0000000..e615532 --- /dev/null +++ b/tasks/artembielov_task2/metrics.txt @@ -0,0 +1,120 @@ +1 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [3.0301003456115723], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5101770758628845], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6946433186531067], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +2 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1666980981826782], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6932384371757507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +3 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6767988801002502], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9144464731216431], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3698585033416748], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9271523356437683], 'step': 0}]}}} +score: 0.9271523356437683 + +4 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5767467021942139], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8542115092277527], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.43192484974861145], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.874834418296814], 'step': 0}]}}} +score: 0.874834418296814 + +5 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517143726348877], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8977329134941101], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26716887950897217], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9192053079605103], 'step': 0}]}}} +score: 0.9192053079605103 + +6 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.627263069152832], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9040212035179138], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.44108766317367554], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8999999761581421], 'step': 0}]}}} +score: 0.8999999761581421 + +7 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6655551791191101], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9402614831924438], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31707772612571716], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9370861053466797], 'step': 0}]}}} +score: 0.9370861053466797 + +8 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5643975138664246], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8945887684822083], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2649300992488861], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} +score: 0.8960264921188354 + +9 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5805342197418213], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8858183026313782], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31061357259750366], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9059602618217468], 'step': 0}]}}} +score: 0.9059602618217468 + +10 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5670236349105835], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8628164529800415], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41568616032600403], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8741722106933594], 'step': 0}]}}} +score: 0.8741722106933594 + +11 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6804172396659851], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8922720551490784], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.265455424785614], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9006622433662415], 'step': 0}]}}} +score: 0.9006622433662415 + +12 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.48696476221084595], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8876385688781738], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26986125111579895], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9079470038414001], 'step': 0}]}}} +score: 0.9079470038414001 + +13 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5567178130149841], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9182525277137756], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3633168339729309], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9251655340194702], 'step': 0}]}}} +score: 0.9251655340194702 + +14 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5764991641044617], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8808538913726807], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31189629435539246], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +15 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6970908641815186], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8904517889022827], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.571384847164154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +16 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [8.397660255432129], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5062054991722107], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6948115229606628], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +17 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [2.28014874458313], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6157537698745728], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6675699353218079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6476821303367615], 'step': 0}]}}} +score: 0.6476821303367615 + +18 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4543749988079071], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9220585823059082], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.24996311962604523], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.926490068435669], 'step': 0}]}}} +score: 0.926490068435669 + +19 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6190159320831299], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4576696455478668], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9291390776634216], 'step': 0}]}}} +score: 0.9291390776634216 + +20 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46962010860443115], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8851563930511475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30790144205093384], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9092715382575989], 'step': 0}]}}} +score: 0.9092715382575989 + +21 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5608833432197571], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8878040909767151], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2994978427886963], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +22 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6217741370201111], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8616580963134766], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4590270519256592], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8801324367523193], 'step': 0}]}}} +score: 0.8801324367523193 + +23 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.547469437122345], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8735727071762085], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3508225679397583], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8913907408714294], 'step': 0}]}}} +score: 0.8913907408714294 + +24 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.179666042327881], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5177891850471497], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6952712535858154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +25 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5122357606887817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9543273448944092], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.32478758692741394], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9430463314056396], 'step': 0}]}}} +score: 0.9430463314056396 + +26 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5002010464668274], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8972364664077759], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2633877694606781], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9172185659408569], 'step': 0}]}}} +score: 0.9172185659408569 + +27 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4500119686126709], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9329802989959717], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31237509846687317], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.934437096118927], 'step': 0}]}}} +score: 0.934437096118927 + +28 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.882015705108643], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.693439245223999], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +29 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1582846641540527], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7982789874076843], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6303998231887817], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8695363998413086], 'step': 0}]}}} +score: 0.8695363998413086 + +30 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6176189184188843], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9756743311882019], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.29317381978034973], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9490066170692444], 'step': 0}]}}} +score: 0.9490066170692444 + From 564dcd97c4433cf9f6128c953026b66317baa470 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 2 Feb 2021 20:08:09 +0200 Subject: [PATCH 05/21] Delete Mask.py --- tasks/artembielov_task2/Mask.py | 94 --------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 tasks/artembielov_task2/Mask.py diff --git a/tasks/artembielov_task2/Mask.py b/tasks/artembielov_task2/Mask.py deleted file mode 100644 index 2bbc09c..0000000 --- a/tasks/artembielov_task2/Mask.py +++ /dev/null @@ -1,94 +0,0 @@ -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 180 -img_width = 180 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', - batch_size=batch_size, - image_size=(img_height,img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', - batch_size=batch_size, - image_size=(img_height,img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - - -def normalize(image, label): - image = tf.cast(image/255., tf.float32) - return image, label - - -class_names = ds_train.class_names -ds_train = ds_train.map(normalize) -ds_val = ds_val.map(normalize) - -AUTOTUNE = tf.data.AUTOTUNE - -ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) -ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), - layers.Conv2D(16, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(32, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(64, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Flatten(), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait = True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, - epochs=10, - validation_data=ds_val, - callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, - epochs=10, - validation_data=ds_val) From 4276b8871816309e1f1ca62e4ee461ac86a67d3a Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 2 Feb 2021 20:08:36 +0200 Subject: [PATCH 06/21] Add files via upload --- tasks/artembielov_task2/Mask.py | 94 +++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tasks/artembielov_task2/Mask.py diff --git a/tasks/artembielov_task2/Mask.py b/tasks/artembielov_task2/Mask.py new file mode 100644 index 0000000..0e1c858 --- /dev/null +++ b/tasks/artembielov_task2/Mask.py @@ -0,0 +1,94 @@ +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 180 +img_width = 180 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + + +def normalize(image, label): + image = tf.cast(image / 255., tf.float32) + return image, label + + +class_names = ds_train.class_names +ds_train = ds_train.map(normalize) +ds_val = ds_val.map(normalize) + +AUTOTUNE = tf.data.AUTOTUNE + +ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, + epochs=10, + validation_data=ds_val, + callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, + epochs=10, + validation_data=ds_val) From 90e5964809db75aeaf7ca1e8866d1b56cae177bc Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Wed, 3 Feb 2021 19:56:17 +0200 Subject: [PATCH 07/21] Add files via upload --- tasks/artembielov_task3/Mask(TL).py | 79 ++++++++++++++++++ tasks/artembielov_task3/metrics2.txt | 120 +++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 tasks/artembielov_task3/Mask(TL).py create mode 100644 tasks/artembielov_task3/metrics2.txt diff --git a/tasks/artembielov_task3/Mask(TL).py b/tasks/artembielov_task3/Mask(TL).py new file mode 100644 index 0000000..55239e3 --- /dev/null +++ b/tasks/artembielov_task3/Mask(TL).py @@ -0,0 +1,79 @@ +import tensorflow_hub as hub +import tensorflow as tf +from tensorflow.keras import datasets, layers, models +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + + +model_name = 'model_v3.h5' +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 224 +img_width = 224 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + +class_names = ds_train.class_names + +feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" +feature_extractor_layer = hub.KerasLayer( + feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + feature_extractor_layer, + tf.keras.layers.Dense(num_classes), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait = True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, epochs=10, validation_data=ds_val) + +model.save('models/'+model_name) diff --git a/tasks/artembielov_task3/metrics2.txt b/tasks/artembielov_task3/metrics2.txt new file mode 100644 index 0000000..e98cff5 --- /dev/null +++ b/tasks/artembielov_task3/metrics2.txt @@ -0,0 +1,120 @@ +1 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517565131187439], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28460147976875305], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} +score: 0.8960264921188354 + +2 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6755658388137817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.640906810760498], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6557091474533081], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6900662183761597], 'step': 0}]}}} +score: 0.6900662183761597 + +3 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43988722562789917], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9091510772705078], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3098181188106537], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9145695567131042], 'step': 0}]}}} +score: 0.9145695567131042 + +4 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5314217209815979], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8613271713256836], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3702387809753418], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.878145694732666], 'step': 0}]}}} +score: 0.878145694732666 + +5 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5134807229042053], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8576865792274475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.37029528617858887], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8721854090690613], 'step': 0}]}}} +score: 0.8721854090690613 + +6 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6944428086280823], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8555353283882141], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6856627464294434], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8556291460990906], 'step': 0}]}}} +score: 0.8556291460990906 + +7 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.44080615043640137], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.883336067199707], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27165472507476807], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8900662064552307], 'step': 0}]}}} +score: 0.8900662064552307 + +8 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.47215789556503296], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30887502431869507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8768212199211121], 'step': 0}]}}} +score: 0.8768212199211121 + +9 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6760485172271729], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7871918082237244], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6525512933731079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} +score: 0.8231788277626038 + +10 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.49988970160484314], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8692702054977417], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34235015511512756], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} +score: 0.8834437131881714 + +11 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6665294170379639], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6789674162864685], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.634369432926178], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7152317762374878], 'step': 0}]}}} +score: 0.7152317762374878 + +12 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5008093118667603], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8790335655212402], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34613117575645447], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8814569711685181], 'step': 0}]}}} +score: 0.8814569711685181 + +13 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6921001672744751], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8755584955215454], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6828383803367615], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8754966855049133], 'step': 0}]}}} +score: 0.8754966855049133 + +14 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5217590928077698], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.894092321395874], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3539324402809143], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +15 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5118488669395447], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41935527324676514], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.865562915802002], 'step': 0}]}}} +score: 0.865562915802002 + +16 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5413548350334167], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.922389566898346], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34384459257125854], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} +score: 0.9165562987327576 + +17 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6866899728775024], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7708091735839844], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6696961522102356], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} +score: 0.8231788277626038 + +18 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4633551239967346], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8883005380630493], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26650261878967285], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9039735198020935], 'step': 0}]}}} +score: 0.9039735198020935 + +19 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5202623605728149], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4311300218105316], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8966887593269348], 'step': 0}]}}} +score: 0.8966887593269348 + +20 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5793002247810364], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8548734188079834], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.40468114614486694], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} +score: 0.8834437131881714 + +21 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6710097193717957], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7031275629997253], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6361395120620728], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7543046474456787], 'step': 0}]}}} +score: 0.7543046474456787 + +22 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4336754083633423], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9278504252433777], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3586457371711731], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} +score: 0.9165562987327576 + +23 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46024826169013977], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9197418689727783], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3174518942832947], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9125827550888062], 'step': 0}]}}} +score: 0.9125827550888062 + +24 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5560460090637207], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3706013560295105], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9046357870101929], 'step': 0}]}}} +score: 0.9046357870101929 + +25 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6939303874969482], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6286612749099731], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6873336434364319], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7205297946929932], 'step': 0}]}}} +score: 0.7205297946929932 + +26 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43818390369415283], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28707796335220337], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9119205474853516], 'step': 0}]}}} +score: 0.9119205474853516 + +27 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5279895663261414], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3609880805015564], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8854304552078247], 'step': 0}]}}} +score: 0.8854304552078247 + +28 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4643488824367523], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9394340515136719], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31463563442230225], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9139072895050049], 'step': 0}]}}} +score: 0.9139072895050049 + +29 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4549124836921692], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.889293372631073], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27763280272483826], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8933774828910828], 'step': 0}]}}} +score: 0.8933774828910828 + +30 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6735646724700928], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7860334515571594], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6475100517272949], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8072847723960876], 'step': 0}]}}} +score: 0.8072847723960876 + From 9da9deed77db322afddb34838a88d1c06c47fe03 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Wed, 3 Feb 2021 20:00:06 +0200 Subject: [PATCH 08/21] Delete Mask(TL).py --- tasks/artembielov_task3/Mask(TL).py | 79 ----------------------------- 1 file changed, 79 deletions(-) delete mode 100644 tasks/artembielov_task3/Mask(TL).py diff --git a/tasks/artembielov_task3/Mask(TL).py b/tasks/artembielov_task3/Mask(TL).py deleted file mode 100644 index 55239e3..0000000 --- a/tasks/artembielov_task3/Mask(TL).py +++ /dev/null @@ -1,79 +0,0 @@ -import tensorflow_hub as hub -import tensorflow as tf -from tensorflow.keras import datasets, layers, models -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - - -model_name = 'model_v3.h5' -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 224 -img_width = 224 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - -class_names = ds_train.class_names - -feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" -feature_extractor_layer = hub.KerasLayer( - feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - feature_extractor_layer, - tf.keras.layers.Dense(num_classes), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait = True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, epochs=10, validation_data=ds_val) - -model.save('models/'+model_name) From 0a4d842e721e2e37d5fae62c3be3052eea665294 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Wed, 3 Feb 2021 20:00:17 +0200 Subject: [PATCH 09/21] Add files via upload --- tasks/artembielov_task3/Mask(TL).py | 79 +++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 tasks/artembielov_task3/Mask(TL).py diff --git a/tasks/artembielov_task3/Mask(TL).py b/tasks/artembielov_task3/Mask(TL).py new file mode 100644 index 0000000..84c0298 --- /dev/null +++ b/tasks/artembielov_task3/Mask(TL).py @@ -0,0 +1,79 @@ +import tensorflow_hub as hub +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + + +model_name = 'model_v3.h5' +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 224 +img_width = 224 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + +class_names = ds_train.class_names + +feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" +feature_extractor_layer = hub.KerasLayer( + feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + feature_extractor_layer, + tf.keras.layers.Dense(num_classes), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, epochs=10, validation_data=ds_val) + +model.save('models/' + model_name) From 28e62703d18f4423fcf84f5b8600a19b107fce06 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:46:43 +0200 Subject: [PATCH 10/21] Delete tasks directory --- .../House price/model_v3.ipynb | 977 ------------------ .../artembielov_task1/House price/model_v3.py | 58 -- .../artembielov_task1/Titanic/model_v1.ipynb | 693 ------------- tasks/artembielov_task1/Titanic/model_v1.py | 21 - tasks/artembielov_task2/Mask.py | 94 -- tasks/artembielov_task2/metrics.txt | 120 --- tasks/artembielov_task3/Mask(TL).py | 79 -- tasks/artembielov_task3/metrics2.txt | 120 --- ...sification_example_with_Iris_dataset.ipynb | 492 --------- ...lassification_example_with_Iris_dataset.py | 193 ---- tasks/task_1/README.md | 3 - 11 files changed, 2850 deletions(-) delete mode 100644 tasks/artembielov_task1/House price/model_v3.ipynb delete mode 100644 tasks/artembielov_task1/House price/model_v3.py delete mode 100644 tasks/artembielov_task1/Titanic/model_v1.ipynb delete mode 100644 tasks/artembielov_task1/Titanic/model_v1.py delete mode 100644 tasks/artembielov_task2/Mask.py delete mode 100644 tasks/artembielov_task2/metrics.txt delete mode 100644 tasks/artembielov_task3/Mask(TL).py delete mode 100644 tasks/artembielov_task3/metrics2.txt delete mode 100644 tasks/task_1/Classification_example_with_Iris_dataset.ipynb delete mode 100644 tasks/task_1/Classification_example_with_Iris_dataset.py delete mode 100644 tasks/task_1/README.md diff --git a/tasks/artembielov_task1/House price/model_v3.ipynb b/tasks/artembielov_task1/House price/model_v3.ipynb deleted file mode 100644 index 47ec728..0000000 --- a/tasks/artembielov_task1/House price/model_v3.ipynb +++ /dev/null @@ -1,977 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "test = pd.read_csv(\"data/test.csv\")\n", - "train = pd.read_csv(\"data/train.csv\")\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Fix skewness(log)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" - ] - } - ], - "source": [ - "\n", - "target = np.log(train.SalePrice) \n" - ] - }, - { - "cell_type": "heading", - "metadata": { - "collapsed": false - }, - "level": 1, - "source": [ - "Explore correlations" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" - ] - } - ], - "source": [ - "\n", - "numeric_features = train.select_dtypes(include=[np.number])\n", - "print(numeric_features.dtypes)\n", - "\n", - "corr = numeric_features.corr()\n", - "print(corr['SalePrice'].sort_values(ascending=False)[:5], '\\n')\n", - "print(corr['SalePrice'].sort_values(ascending=False)[-5:])\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Explore null data" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Null Count\nFeature \nPoolQC 1453\nMiscFeature 1406\nAlley 1369\nFence 1179\nFireplaceQu 690\nLotFrontage 259\nGarageYrBlt 81\nGarageCond 81\nGarageType 81\nGarageFinish 81\nGarageQual 81\nBsmtFinType2 38\nBsmtExposure 38\nBsmtQual 37\nBsmtCond 37\nBsmtFinType1 37\nMasVnrArea 8\nMasVnrType 8\nElectrical 1\nId 0\nFunctional 0\nFireplaces 0\nKitchenQual 0\nKitchenAbvGr 0\nBedroomAbvGr 0\n" - ] - } - ], - "source": [ - "nulls = pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])\n", - "nulls.columns = ['Null Count']\n", - "nulls.index.name = 'Feature'\n", - "print(nulls)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Drop useless data" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", - "

2919 rows × 74 columns

\n", - "
" - ], - "text/plain": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", - "

2919 rows × 74 columns

\n", - "
" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition']))\n", - "\n", - "all_data = all_data.drop(['Utilities'], axis=1)\n", - "\n", - "useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence']\n", - "all_data.drop(useless, axis=1)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Using one-hot encoding to engineer fetures: 'Street', 'SaleCondition'" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "'Street'" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original: \n\nPave 2907\nGrvl 12\nName: Street, dtype: int64 \n\nEncoded: \n\n1 2907\n0 12\nName: enc_street, dtype: int64\n" - ] - } - ], - "source": [ - "print(\"Original: \\n\")\n", - "print(all_data.Street.value_counts(), \"\\n\")\n", - "\n", - "\n", - "def encode(x):\n", - " return 1 if x == 'Partial' else 0\n", - "\n", - "\n", - "all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True)\n", - "all_data['enc_condition'] = all_data.SaleCondition.apply(encode)\n", - "\n", - "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "\n", - "print ('Encoded: \\n')\n", - "print (all_data.enc_street.value_counts())\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Remove null-data" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], - "source": [ - "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", - "\n", - "print(sum(data_train.isnull().sum() != 0)) \n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Linear model" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.ensemble import GradientBoostingRegressor\n", - "from sklearn.neural_network import MLPRegressor\n", - "from sklearn.linear_model import Ridge\n", - "from sklearn.linear_model import LinearRegression\n", - "from mlxtend.regressor import StackingRegressor\n", - "\n", - "\n", - "X_train = data_train\n", - "X_test = data_test\n", - "y = target\n", - "\n", - "lr = LinearRegression(n_jobs=-1)\n", - "rd = Ridge(alpha=4.84)\n", - "rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1)\n", - "gb = GradientBoostingRegressor(n_estimators=40, max_depth=2)\n", - "nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "\n", - "Initialize linear regression model" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Fit model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.fit(X_train, y)\n" - ] - }, - { - "cell_type": "heading", - "metadata": {}, - "level": 1, - "source": [ - "Make a submission" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "ename": "NotFittedError", - "evalue": "This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNotFittedError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mY_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfinal_predictions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\regressor\\stacking_regression.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mPredicted\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \"\"\"\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_is_fitted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'regr_'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0mmeta_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_meta_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\externals\\estimator_checks.py\u001b[0m in \u001b[0;36mcheck_is_fitted\u001b[0;34m(estimator, attributes, msg, all_or_any)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mall_or_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mattr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mattributes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFittedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNotFittedError\u001b[0m: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method." - ], - "output_type": "error" - } - ], - "source": [ - "y_pred = model.predict(X_train)\n", - "\n", - "Y_pred = model.predict(X_test)\n", - "\n", - "final_predictions = np.exp(Y_pred)\n", - "submission = pd.DataFrame()\n", - "submission['Id'] = test['Id']\n", - "submission['SalePrice'] = final_predictions\n", - "submission.to_csv('submission_v3.csv', index=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/tasks/artembielov_task1/House price/model_v3.py b/tasks/artembielov_task1/House price/model_v3.py deleted file mode 100644 index 4cfeb1a..0000000 --- a/tasks/artembielov_task1/House price/model_v3.py +++ /dev/null @@ -1,58 +0,0 @@ -import pandas as pd -import numpy as np -from sklearn.ensemble import RandomForestRegressor -from sklearn.ensemble import GradientBoostingRegressor -from sklearn.neural_network import MLPRegressor -from sklearn.linear_model import Ridge -from sklearn.linear_model import LinearRegression -from mlxtend.regressor import StackingRegressor - - -path = 'D:/projects/Python/Samsung2/House price/data/' -test = pd.read_csv(path + 'test.csv') -train = pd.read_csv(path + 'train.csv') - -target = np.log(train.SalePrice) - - -all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition'])) - -all_data = all_data.drop(['Utilities'], axis=1) - -useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence'] -all_data.drop(useless, axis=1) - - -def encode(x): - return 1 if x == 'Partial' else 0 - - -all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True) -all_data['enc_condition'] = all_data.SaleCondition.apply(encode) - -data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna() -data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna() - -X_train = data_train -X_test = data_test -y = target - -lr = LinearRegression(n_jobs=-1) -rd = Ridge(alpha=4.84) -rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1) -gb = GradientBoostingRegressor(n_estimators=40, max_depth=2) -nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75) - -model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr) - -model.fit(X_train, y) - -y_pred = model.predict(X_train) - -Y_pred = model.predict(X_test) - -final_predictions = np.exp(Y_pred) -submission = pd.DataFrame() -submission['Id'] = test['Id'] -submission['SalePrice'] = final_predictions -submission.to_csv('submission_v3.csv', index=False) diff --git a/tasks/artembielov_task1/Titanic/model_v1.ipynb b/tasks/artembielov_task1/Titanic/model_v1.ipynb deleted file mode 100644 index 0fb309c..0000000 --- a/tasks/artembielov_task1/Titanic/model_v1.ipynb +++ /dev/null @@ -1,693 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", - "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.651550Z", - "iopub.status.busy": "2021-01-25T14:39:05.650747Z", - "iopub.status.idle": "2021-01-25T14:39:05.656260Z", - "shell.execute_reply": "2021-01-25T14:39:05.655743Z" - }, - "papermill": { - "duration": 0.018492, - "end_time": "2021-01-25T14:39:05.656405", - "exception": false, - "start_time": "2021-01-25T14:39:05.637913", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "import pandas as pd \n", - "from sklearn.ensemble import RandomForestClassifier\n", - "\n", - "\n", - "path = 'D:/projects/Python/Samsung2/Titanic/data/'\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.674687Z", - "iopub.status.busy": "2021-01-25T14:39:05.673983Z", - "iopub.status.idle": "2021-01-25T14:39:05.716139Z", - "shell.execute_reply": "2021-01-25T14:39:05.715681Z" - }, - "papermill": { - "duration": 0.053652, - "end_time": "2021-01-25T14:39:05.716241", - "exception": false, - "start_time": "2021-01-25T14:39:05.662589", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", - "
" - ], - "text/plain": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", - "
" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "train_data = pd.read_csv(path + \"train.csv\")\n", - "train_data.head()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.740555Z", - "iopub.status.busy": "2021-01-25T14:39:05.735599Z", - "iopub.status.idle": "2021-01-25T14:39:05.755816Z", - "shell.execute_reply": "2021-01-25T14:39:05.756321Z" - }, - "papermill": { - "duration": 0.032416, - "end_time": "2021-01-25T14:39:05.756473", - "exception": false, - "start_time": "2021-01-25T14:39:05.724057", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", - "
" - ], - "text/plain": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", - "
" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test_data = pd.read_csv(path + \"test.csv\")\n", - "test_data.head()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.777922Z", - "iopub.status.busy": "2021-01-25T14:39:05.777250Z", - "iopub.status.idle": "2021-01-25T14:39:05.781165Z", - "shell.execute_reply": "2021-01-25T14:39:05.781695Z" - }, - "papermill": { - "duration": 0.018524, - "end_time": "2021-01-25T14:39:05.781858", - "exception": false, - "start_time": "2021-01-25T14:39:05.763334", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "% of women who survived: 0.7420382165605095\n" - ] - } - ], - "source": [ - "women = train_data.loc[train_data.Sex == 'female'][\"Survived\"]\n", - "rate_women = sum(women)/len(women)\n", - "\n", - "print(\"% of women who survived:\", rate_women)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.803850Z", - "iopub.status.busy": "2021-01-25T14:39:05.803169Z", - "iopub.status.idle": "2021-01-25T14:39:05.807022Z", - "shell.execute_reply": "2021-01-25T14:39:05.807547Z" - }, - "papermill": { - "duration": 0.01846, - "end_time": "2021-01-25T14:39:05.807679", - "exception": false, - "start_time": "2021-01-25T14:39:05.789219", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "% of men who survived: 0.18890814558058924\n" - ] - } - ], - "source": [ - "men = train_data.loc[train_data.Sex == 'male'][\"Survived\"]\n", - "rate_men = sum(men)/len(men)\n", - "\n", - "print(\"% of men who survived:\", rate_men)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "execution": { - "iopub.execute_input": "2021-01-25T14:39:05.831772Z", - "iopub.status.busy": "2021-01-25T14:39:05.831113Z", - "iopub.status.idle": "2021-01-25T14:39:07.616680Z", - "shell.execute_reply": "2021-01-25T14:39:07.616040Z" - }, - "papermill": { - "duration": 1.80116, - "end_time": "2021-01-25T14:39:07.616814", - "exception": false, - "start_time": "2021-01-25T14:39:05.815654", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Your submission was successfully saved!\n" - ] - } - ], - "source": [ - "y = train_data[\"Survived\"]\n", - "\n", - "features = [\"Pclass\", \"Sex\", \"SibSp\", \"Parch\"]\n", - "X = pd.get_dummies(train_data[features])\n", - "X_test = pd.get_dummies(test_data[features])\n", - "\n", - "model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)\n", - "model.fit(X, y)\n", - "predictions = model.predict(X_test)\n", - "\n", - "output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})\n", - "output.to_csv('my_submission.csv', index=False)\n", - "print(\"Your submission was successfully saved!\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.6" - }, - "papermill": { - "duration": 6.81406, - "end_time": "2021-01-25T14:39:07.733035", - "environment_variables": {}, - "exception": null, - "input_path": "__notebook__.ipynb", - "output_path": "__notebook__.ipynb", - "parameters": {}, - "start_time": "2021-01-25T14:39:00.918975", - "version": "2.1.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tasks/artembielov_task1/Titanic/model_v1.py b/tasks/artembielov_task1/Titanic/model_v1.py deleted file mode 100644 index bfd0f87..0000000 --- a/tasks/artembielov_task1/Titanic/model_v1.py +++ /dev/null @@ -1,21 +0,0 @@ -import pandas as pd -from sklearn.ensemble import RandomForestClassifier - - -path = 'D:/projects/Python/Samsung2/Titanic/data/' - -train_data = pd.read_csv(path + "train.csv") -test_data = pd.read_csv(path + "test.csv") - -y = train_data["Survived"] - -features = ["Pclass", "Sex", "SibSp", "Parch"] -X = pd.get_dummies(train_data[features]) -X_test = pd.get_dummies(test_data[features]) - -model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) -model.fit(X, y) -predictions = model.predict(X_test) - -output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions}) -output.to_csv('my_submission.csv', index=False) diff --git a/tasks/artembielov_task2/Mask.py b/tasks/artembielov_task2/Mask.py deleted file mode 100644 index 0e1c858..0000000 --- a/tasks/artembielov_task2/Mask.py +++ /dev/null @@ -1,94 +0,0 @@ -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 180 -img_width = 180 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - - -def normalize(image, label): - image = tf.cast(image / 255., tf.float32) - return image, label - - -class_names = ds_train.class_names -ds_train = ds_train.map(normalize) -ds_val = ds_val.map(normalize) - -AUTOTUNE = tf.data.AUTOTUNE - -ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) -ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), - layers.Conv2D(16, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(32, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(64, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Flatten(), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait=True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, - epochs=10, - validation_data=ds_val, - callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, - epochs=10, - validation_data=ds_val) diff --git a/tasks/artembielov_task2/metrics.txt b/tasks/artembielov_task2/metrics.txt deleted file mode 100644 index e615532..0000000 --- a/tasks/artembielov_task2/metrics.txt +++ /dev/null @@ -1,120 +0,0 @@ -1 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [3.0301003456115723], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5101770758628845], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6946433186531067], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} -score: 0.499337762594223 - -2 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1666980981826782], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6932384371757507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} -score: 0.499337762594223 - -3 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6767988801002502], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9144464731216431], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3698585033416748], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9271523356437683], 'step': 0}]}}} -score: 0.9271523356437683 - -4 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5767467021942139], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8542115092277527], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.43192484974861145], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.874834418296814], 'step': 0}]}}} -score: 0.874834418296814 - -5 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517143726348877], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8977329134941101], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26716887950897217], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9192053079605103], 'step': 0}]}}} -score: 0.9192053079605103 - -6 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.627263069152832], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9040212035179138], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.44108766317367554], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8999999761581421], 'step': 0}]}}} -score: 0.8999999761581421 - -7 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6655551791191101], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9402614831924438], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31707772612571716], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9370861053466797], 'step': 0}]}}} -score: 0.9370861053466797 - -8 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5643975138664246], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8945887684822083], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2649300992488861], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} -score: 0.8960264921188354 - -9 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5805342197418213], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8858183026313782], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31061357259750366], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9059602618217468], 'step': 0}]}}} -score: 0.9059602618217468 - -10 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5670236349105835], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8628164529800415], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41568616032600403], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8741722106933594], 'step': 0}]}}} -score: 0.8741722106933594 - -11 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6804172396659851], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8922720551490784], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.265455424785614], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9006622433662415], 'step': 0}]}}} -score: 0.9006622433662415 - -12 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.48696476221084595], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8876385688781738], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26986125111579895], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9079470038414001], 'step': 0}]}}} -score: 0.9079470038414001 - -13 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5567178130149841], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9182525277137756], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3633168339729309], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9251655340194702], 'step': 0}]}}} -score: 0.9251655340194702 - -14 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5764991641044617], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8808538913726807], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31189629435539246], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} -score: 0.9033112525939941 - -15 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6970908641815186], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8904517889022827], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.571384847164154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} -score: 0.9033112525939941 - -16 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [8.397660255432129], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5062054991722107], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6948115229606628], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} -score: 0.499337762594223 - -17 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [2.28014874458313], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6157537698745728], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6675699353218079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6476821303367615], 'step': 0}]}}} -score: 0.6476821303367615 - -18 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4543749988079071], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9220585823059082], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.24996311962604523], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.926490068435669], 'step': 0}]}}} -score: 0.926490068435669 - -19 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6190159320831299], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4576696455478668], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9291390776634216], 'step': 0}]}}} -score: 0.9291390776634216 - -20 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46962010860443115], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8851563930511475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30790144205093384], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9092715382575989], 'step': 0}]}}} -score: 0.9092715382575989 - -21 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5608833432197571], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8878040909767151], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2994978427886963], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} -score: 0.9033112525939941 - -22 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6217741370201111], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8616580963134766], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4590270519256592], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8801324367523193], 'step': 0}]}}} -score: 0.8801324367523193 - -23 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.547469437122345], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8735727071762085], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3508225679397583], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8913907408714294], 'step': 0}]}}} -score: 0.8913907408714294 - -24 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.179666042327881], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5177891850471497], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6952712535858154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} -score: 0.499337762594223 - -25 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5122357606887817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9543273448944092], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.32478758692741394], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9430463314056396], 'step': 0}]}}} -score: 0.9430463314056396 - -26 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5002010464668274], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8972364664077759], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2633877694606781], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9172185659408569], 'step': 0}]}}} -score: 0.9172185659408569 - -27 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4500119686126709], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9329802989959717], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31237509846687317], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.934437096118927], 'step': 0}]}}} -score: 0.934437096118927 - -28 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.882015705108643], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.693439245223999], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} -score: 0.499337762594223 - -29 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1582846641540527], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7982789874076843], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6303998231887817], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8695363998413086], 'step': 0}]}}} -score: 0.8695363998413086 - -30 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6176189184188843], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9756743311882019], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.29317381978034973], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9490066170692444], 'step': 0}]}}} -score: 0.9490066170692444 - diff --git a/tasks/artembielov_task3/Mask(TL).py b/tasks/artembielov_task3/Mask(TL).py deleted file mode 100644 index 84c0298..0000000 --- a/tasks/artembielov_task3/Mask(TL).py +++ /dev/null @@ -1,79 +0,0 @@ -import tensorflow_hub as hub -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - - -model_name = 'model_v3.h5' -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 224 -img_width = 224 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - -class_names = ds_train.class_names - -feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" -feature_extractor_layer = hub.KerasLayer( - feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - feature_extractor_layer, - tf.keras.layers.Dense(num_classes), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait=True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, epochs=10, validation_data=ds_val) - -model.save('models/' + model_name) diff --git a/tasks/artembielov_task3/metrics2.txt b/tasks/artembielov_task3/metrics2.txt deleted file mode 100644 index e98cff5..0000000 --- a/tasks/artembielov_task3/metrics2.txt +++ /dev/null @@ -1,120 +0,0 @@ -1 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517565131187439], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28460147976875305], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} -score: 0.8960264921188354 - -2 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6755658388137817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.640906810760498], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6557091474533081], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6900662183761597], 'step': 0}]}}} -score: 0.6900662183761597 - -3 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43988722562789917], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9091510772705078], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3098181188106537], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9145695567131042], 'step': 0}]}}} -score: 0.9145695567131042 - -4 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5314217209815979], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8613271713256836], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3702387809753418], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.878145694732666], 'step': 0}]}}} -score: 0.878145694732666 - -5 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5134807229042053], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8576865792274475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.37029528617858887], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8721854090690613], 'step': 0}]}}} -score: 0.8721854090690613 - -6 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6944428086280823], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8555353283882141], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6856627464294434], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8556291460990906], 'step': 0}]}}} -score: 0.8556291460990906 - -7 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.44080615043640137], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.883336067199707], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27165472507476807], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8900662064552307], 'step': 0}]}}} -score: 0.8900662064552307 - -8 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.47215789556503296], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30887502431869507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8768212199211121], 'step': 0}]}}} -score: 0.8768212199211121 - -9 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6760485172271729], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7871918082237244], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6525512933731079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} -score: 0.8231788277626038 - -10 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.49988970160484314], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8692702054977417], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34235015511512756], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} -score: 0.8834437131881714 - -11 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6665294170379639], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6789674162864685], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.634369432926178], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7152317762374878], 'step': 0}]}}} -score: 0.7152317762374878 - -12 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5008093118667603], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8790335655212402], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34613117575645447], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8814569711685181], 'step': 0}]}}} -score: 0.8814569711685181 - -13 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6921001672744751], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8755584955215454], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6828383803367615], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8754966855049133], 'step': 0}]}}} -score: 0.8754966855049133 - -14 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5217590928077698], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.894092321395874], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3539324402809143], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} -score: 0.9033112525939941 - -15 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5118488669395447], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41935527324676514], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.865562915802002], 'step': 0}]}}} -score: 0.865562915802002 - -16 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5413548350334167], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.922389566898346], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34384459257125854], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} -score: 0.9165562987327576 - -17 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6866899728775024], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7708091735839844], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6696961522102356], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} -score: 0.8231788277626038 - -18 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4633551239967346], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8883005380630493], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26650261878967285], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9039735198020935], 'step': 0}]}}} -score: 0.9039735198020935 - -19 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5202623605728149], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4311300218105316], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8966887593269348], 'step': 0}]}}} -score: 0.8966887593269348 - -20 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5793002247810364], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8548734188079834], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.40468114614486694], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} -score: 0.8834437131881714 - -21 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6710097193717957], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7031275629997253], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6361395120620728], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7543046474456787], 'step': 0}]}}} -score: 0.7543046474456787 - -22 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4336754083633423], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9278504252433777], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3586457371711731], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} -score: 0.9165562987327576 - -23 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46024826169013977], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9197418689727783], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3174518942832947], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9125827550888062], 'step': 0}]}}} -score: 0.9125827550888062 - -24 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5560460090637207], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3706013560295105], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9046357870101929], 'step': 0}]}}} -score: 0.9046357870101929 - -25 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6939303874969482], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6286612749099731], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6873336434364319], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7205297946929932], 'step': 0}]}}} -score: 0.7205297946929932 - -26 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43818390369415283], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28707796335220337], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9119205474853516], 'step': 0}]}}} -score: 0.9119205474853516 - -27 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5279895663261414], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3609880805015564], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8854304552078247], 'step': 0}]}}} -score: 0.8854304552078247 - -28 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4643488824367523], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9394340515136719], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31463563442230225], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9139072895050049], 'step': 0}]}}} -score: 0.9139072895050049 - -29 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4549124836921692], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.889293372631073], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27763280272483826], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8933774828910828], 'step': 0}]}}} -score: 0.8933774828910828 - -30 model -metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6735646724700928], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7860334515571594], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6475100517272949], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8072847723960876], 'step': 0}]}}} -score: 0.8072847723960876 - diff --git a/tasks/task_1/Classification_example_with_Iris_dataset.ipynb b/tasks/task_1/Classification_example_with_Iris_dataset.ipynb deleted file mode 100644 index 7e8e1a2..0000000 --- a/tasks/task_1/Classification_example_with_Iris_dataset.ipynb +++ /dev/null @@ -1,492 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "entertaining-fishing", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "from sklearn import datasets\n", - "from matplotlib import pyplot as plt\n", - "\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.tree import DecisionTreeClassifier\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.metrics import confusion_matrix" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "choice-location", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext pycodestyle_magic\n", - "%flake8_on" - ] - }, - { - "cell_type": "markdown", - "id": "accepting-threshold", - "metadata": {}, - "source": [ - "# Classification example with Iris dataset" - ] - }, - { - "cell_type": "markdown", - "id": "derived-yorkshire", - "metadata": {}, - "source": [ - "This example dataset task is in classifying flower based on its features" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "increasing-johnston", - "metadata": {}, - "outputs": [], - "source": [ - "# This dataset boult in `sklearn` library so you can load it directly\n", - "iris = datasets.load_iris()\n", - "iris_features = iris['feature_names']" - ] - }, - { - "cell_type": "markdown", - "id": "japanese-button", - "metadata": {}, - "source": [ - "Print all flowers and features" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "conditional-jungle", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset features:\n", - "['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']\n", - "Dataset classes:\n", - "['setosa' 'versicolor' 'virginica']\n" - ] - } - ], - "source": [ - "print(f\"Dataset features:\\n{iris['feature_names']}\")\n", - "print(f\"Dataset classes:\\n{iris.target_names}\")" - ] - }, - { - "cell_type": "markdown", - "id": "serial-savage", - "metadata": {}, - "source": [ - "Now we should visually analyze the dataset\n", - "\n", - "As we are limited by 2D displays and cannot visualize 4d data in a single plot - let's print data 2-axis at a time" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "indirect-federal", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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nMCSJUsYNGgQ3/rWt/jtb3/LgAEDqKiooKKigmXLljF37tzI7XXo0IFXXnmFCy64gCeeeIKzzjoLgGuvvZZrrrmGZcuW8fOf/zxVVde6MhCRopK5T7RwzVZG9j0ylvtEGzdu5IgjjuCLX/wihx9+OPfddx9VVVW8/PLLnHrqqVRXV/P6668zYMAAunbtys6dOwHo168flZWVrF69muOPP55f//rXjB49ml27dvHee+9x9tlnM2rUKPr27QvAjh07OPbYYwGYNq3BeTkLRslARIrO8D7dYh0ssGzZMr7xjW/Qrl07OnbsyM9+9jM6dOjAddddx44dO6ipqeH6669nwIABTJ48mauuuoouXbrw8ssv88tf/pKJEydSU1PDiBEjuOqqq9i2bRvnnnsue/bswd256667ALj11luZOHEi3bp1Y8yYMfztb3+L7TO0lAX3FYpHaWmpa3EbkdZj5cqVnHjiiYUOo1Vp6JyaWbm7lzb2Ht0zEBERJQMREVEyEBERlAxERAQlAxERQclARERQMpAC08I00lp9+9vfZt68eTm/7/nnn98/fUWSVHQmBaOFaaTYZSZ5a9fug39X33bbbYnEUFNTQ4cOLf8q15WBFIwWppFme+sVmP+j4HcMbrrpJu69997927feeis//OEPufPOOxkxYgSDBw/mlltuAaCyspJ+/frxpS99iYEDB/LWW28xefJkBg4cyKBBg7j77rsBmDx5MrNnzwZg8eLFfOITn+Ckk07i5JNPZufOnezZs4dLLrmEQYMGMXToUJ577rkPxLVt2zY++9nPMnjwYEaOHMmrr766P76LLrqIUaNGcdFFF8VyDnRlIAWTmXCsuqZWC9NIdG+9AtMmwL690L4TXDwHep3coiYnTZrE9ddfz9VXXw3AzJkzufHGG/nzn//MK6+8grszYcIEXnzxRXr37s0bb7zBtGnTGDlyJOXl5WzYsIHly5cD8M477xzQ9t69e5k0aRIzZsxgxIgRvPvuu3Tp0oV77rkHM2PZsmX89a9/5YwzzuD1118/4L233HILQ4cO5fHHH+dPf/oTX/rSl6ioqABgxYoVLFiwgC5durTos2coGUjB5GPCMWkDKucHicD3Bb8r57c4GQwdOpTNmzezceNGqqqq6Nat2/6ZSocOHQrArl27eOONN+jduzd9+vRh5MiRAPTt25c1a9Zw7bXX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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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Mlg1Gx4cAS//Z/DexIQwZswYnnrqqV3TTz31FJ06dWLZsmXMnj2b8vJy5s6du6saedmyZVx55ZUsWrSI9evX8+GHH7Jw4UIWLFjA+PHja+17+/btjBkzht/97nfMnz+fGTNm0K5dO+666y7MjAULFvD4449z0UUX7TaI/c0338yAAQN49913ue2227jwwgt3LVu8eDEzZszg8ccfb9Jnl2jiKOZKoiAsyjEyrXPmYWemnS42hXI+ivP+QMUs2LkdfGfwXjELug3a490NGDCAdevWsWbNGiorK+nQoQMLFizghRdeYMCAAQBs2bKFZcuWcdhhh9G9e3cGDx4MQI8ePVixYgUTJkzgvPPO4+yzz66176VLl9K5c2eOO+44AL72ta8B8PrrrzNhwgQAjjzySLp37857771Xa9vXX3+dP//5zwCcfvrpbNiwgc8+CwabGzFiBO3atdvjzyyNE0cxVxIFYVGOkWmdmlsgM1bO4MzDzszLWyJJKpTzUZzJoOQkaNkmSAQt2wTTTTR69GimTJnCRx99xJgxY/jggw/4t3/7Ny6//PJa61VUVLDPPvvsmu7QoQPz589n+vTp3HPPPTz11FM88MADTY4nk9QYJBlxFHMlURAW5RiZ1hnda3TefunlQiGcj+K8TdRtEFw0FU7/9+C9CVcFNcaMGcMTTzzBlClTGD16NEOHDuWBBx5gy5YtAHz44YesW7dut+3Wr19PdXU1o0aN4qc//Snz5s2rtbxXr16sXbuWOXPmALB582aqqqo46aSTePTRRwF47733WLlyJb169aq1beo6r776Kh07dtx1ZSEikqo4rwwgSAAxJIEavXv3ZvPmzXTp0oXOnTvTuXNnlixZwgknnADAvvvuyyOPPELLli1rbffhhx8yfvx4qqurAfjZz35Wa3mbNm148sknmTBhAlu3bqVdu3bMmDGDK6+8ku9///v07duXVq1aMWnSJPbaa69a295yyy1873vfo1+/fuy9994a/0BEGmQJjDIZq9LSUi8rq916YcmSJRx11FE5iqh50jnNT5kGntHANPkpH34vZjbX3RtsdVC8VwYiBSZT+34NTJOfCuX3UpzPDEQKUKb2/UnUIUjjFcrvRclApEBkat+vgWnyU6H8XnSbSKRAZGrfr4Fp8lOh/F6UDEQKSKb2/RqYJj8Vwu9Ft4lERETJIFvWrFnD+eef3+jthg0bxqeffpp2nT3t3lpEpCGqM0hYoXQZXUjntJgk0V49yjGSqHfIh7b5URRKnKozaECcv8CbbrqJbt26cdVVVwFB5e++++7LpEmTWLhwIZMmTeLpp59my5Yt7Ny5k+eee45x48axcOFCevXqxZo1a7jrrrsoLS2lpKSEsrIytmzZwrnnnss3vvEN3njjDbp06cIzzzxDu3btGDduHMOHD+f8889nzpw5XHvttXz++efstddevPTSS2zYsIGxY8fy+eefA3DnnXdy4oknNvWUSY4VyngGhTJ2QxwKJc4oivI2Uc0v8A/z/sClL1za5FGj6uvC+vjjj6+1zrx585gyZQqvvfYad999Nx06dGDx4sX85Cc/Ye7cufXud9myZVx11VUsWrSI/ffff1cPpDUa6t76oIMO4sUXX2TevHk8+eSTXHPNNU36fJIfCmU8g0IZuyEOhRJnFEV5ZVDfL7Ap2by+Lqy7detWa52zzjqLAw44AAi6lr722msB6NOnD/369at3v4cffjj9+wdxDRw4kIqKilrLG+re+vPPP+fqq6+mvLycli1b7ta1tRSmmvbqO6p3ZH08g3THyLROHHEm8VnjUChxRlGUySAbv8C6XVjXtSddRqd2PNeyZUu2bt0aabs77riDgw8+mPnz51NdXU3btm0bfWzJP4UynkGhjN0Qh0KJM4qiTAbZ+AWOGTOGSy+9lPXr1/Paa6/x5ZdfNrjukCFDeOqppzjttNNYvHgxCxYs2KNjpnZvfdxxx7F582batWvHpk2b6Nq1Ky1atODBBx9k586de/qxJM8UyngGhTJ2QxwKJc5MijIZQPy/wLpdWNe9pZPqyiuv5KKLLuLoo4/myCOPpHfv3uy3336NPma67q1HjRrFQw89xDnnnKOBbEQko6w1LTWzbsBDwMGAA/e6++/qrGPA74BhwBfAOHefV3dfqQq9aSnAzp072bFjB23btuX999/nzDPPZOnSpbRp0ybXoe1SaOdURNLLZdPSKuAGd59nZu2BuWb2orsvTlnnXODr4et44I/he7P2xRdfcNppp7Fjxw7cnbvvvjuvEkE+iaPNezGZvHRy3o+1W4wKoe4ia8nA3dcCa8OfN5vZEqALkJoMRgIPeXB58paZ7W9mncNtm6327dtT9+pGdhdHm/diMnnpZG5961YA3ljzBoASQh4olLqLROoMzKwEGAC8XWdRF2BVyvTqcF7d7S8zszIzK6usrKz3GIVWSZ3P8uVcxtHmvZjMWDkj7bTkRqHUXWQ9GZjZvsCfgevc/bM92Ye73+vupe5e2qlTp92Wt23blg0bNuTNl1ghc3c2bNiQF81Ro/QDXyh9xSfhzMPOTDstuRHHv9Ek/p1ntW8iM2sNPAtMd/ff1LP8v4BX3f3xcHopcGq620T1PUDesWMHq1evZtu2bbHGX6zatm1L165dad26da5D0TODRtIzg/yUD88MMj1AzmZrIgMeBDa6+3UNrHMecDVBa6Ljgd+7+6B0+60vGYiISHq5bE00BBgLLDCz8nDeD4HDANz9HmAaQSJYTtC0dHwW4xERkQZkszXR64BlWMeBq7IVg4iIRFOUvZaKiEhtSgbS7E1eOpnLX7ycyUsn5zqUjMrXlXPfgvsa7FY903JpPJ3TQNH2TSTFoZAKsZIYNEZq0zn9iq4MpFkrpEKsJAaNkdp0Tr+iZCDNWiEVYmUqLFKBXfx0Tr+S1aKzbFCdgTRWIRViJTHQvNRWLOc0Z0Vn2aJkICLSeJmSgW4TiYiIkoGIiCgZiABQvvAx7pt6EeULH6t/eYS26HHUCGSqiUiiDqGQ2t2rLiM+qjOQole+8DEunXMb2w3abJjLRKB/nwu+Wh7DIDtR9pGpJiKJOoRCanevuox46cpAil7ZiulsN6g2Y4cF07WWxzDITpR9ZKqJSKIOoZDa3asuI15KBlL0SnsMpY1DS3daezBda3kMg+xE2Uemmogk6hAKqd296jLiFalpqZl1AA4FtgIV7l6d7cAaoqalkg3lCx+jbMV0SnsMrXWLaNfyGAbZibKPTDURSdQhFFK7e9VlRLfHdQZmth9B99LfAdoAlUBb4GDgLeBud38l9ogzUDIQEWm8pgxuMwV4CDjJ3T+ts9OBwFgz6+Hu98cSqYiI5EyDycDdz0qzbC4wNysRiYhI4iI1LTWzfkBJ6vru/nSWYpIMdB9UsmrVbKiYBSUnQbe0Q5JLM5IxGZjZA0A/YBFQ8+DYASWDHFDbacmqVbPhwRGwczu0bAMXTVVCKBJRrgwGu/vRWY9EIqmv7bSSgcSmYlaQCHxn8F4xS8mgSESpM3jTzJQM8oTaTktWlZwUXBFYy+C95KRcRyQJyVhnYGanAFOBj4AvAQPc3ftlP7zdqWmpnhlIlumZQbPUlKalNe4HxgIL+OqZgeRQ/4P6KwlI9nQbpCRQhKIkg0p3n5r1SEREJGeiJIN3zOwx4L8JbhMBaloqItKcREkG7QiSwNkp89S0VIpL2SRY8gwcNRJKx2XvOLpf3yh6fhafjMnA3ccnEYhI3iqbBM9eG/z8/svBezYSgtr4N4pqbuKVsWmpmT1oZvunTHcIC9FEisOSZ9JPx6W+Nv7SII1XEK8odQb9Ujuqc/dPgAFZi0gk3xw1Mv10XNTGv1FUcxOvKM8MWphZhzAJYGYHRNxOpHmouSWU7WcG3QYFt4b0zCCS/gf1Z+LZE/XMICZRis4uBH4I1IzQPRr4T3d/OMux1UtFZyIijdfkojN3f8jMyoDTw1n/6O6L4wpQRERyr8FkYGb7uvsWgPDLf7cEkLpOPcseAIYD69y9Tz3LTwWeAf4eznra3W9t7AcQEZGmS/cA+Rkz+7WZnWxm+9TMNLMeZnaxmU0Hzkmz/aQMywFmuXv/8KVEICKSIw0mA3c/A3gJuBxYZGafmdkG4BHgEOAid5+SZvuZwMaY45VCsmo2zPp18J7LfcRwnPKFj3Hf1IsoX/hY1o4R6TiZ9pEv5zyp35vEJu0zA3efBkzL4vFPMLP5wBrgX9x9URaPJUmKo4AqqSKsDMcpX/gYl865je0GbTbMZSLQv88FsR4j0nEy7SNfzrmK5wpSlDqDbJkHdHf3Y4A/AH9taEUzu8zMysysrLKyMqn4pCniKKBKqggrw3HKVkxnu0G1GTssmI77GJGOk2kf+XLOVTxXkHKWDNz9s5QH1NOA1mbWsYF173X3Uncv7dSpU6Jxyh6Ko4AqqSKsDMcp7TGUNg4t3WntwXTcx4h0nEz7yJdzruK5gpSxzqBJOzcrAZ5toDXRIcDH7u5mNgiYQnClkDYg1RkUkDg6XUuq47YMxylf+BhlK6ZT2mNo428RRTxGpONk2ke+nHN1uJd3MtUZREoGZtYSOJiUZwzuvjLDNo8DpwIdgY+Bm4HW4bb3mNnVwPeBKmArcL27v5EpFiUDEZHGa3LRmZlNIPgi/5ivRjpzIO2wl+7+nQzL7wTuzHR8ERHJvih9DF0L9HL3DdkORkREciPKA+RVwKZsByJ5SG3FG6V85m3c99AplM+8LdehpBdHrYJqEZqddN1RXB/+uAJ41cz+h9rDXv4my7FJLqmteKOUz7yNS99/lO1mtHn/0aBG4OQf5jqs3cVRq6BahGYp3ZVB+/C1EngRaJMyb9/shyY5pbbijVJWMZ3tZmGNgFFWsQe1CEmIo1ZBtQjNUoNXBu7+HwBmNtrdJ6cuM7PR2Q5McqymrXjNX25qK55WaclQ2rz/KDuA1u6UluxBLUISMv1eo/ze4/i3oX9feSfKeAbz3P3YTPOSoqalCVJb8UYpn3kbZRXTKS0Zmp+3iGrEUaugWoSCs8d1BmZ2LjAM+L/AkymLvgYc7e45+e0pGYiINF5T6gzWAHOBEeF7jc3AP8cTnoiI5IN0zwzmA/PN7FF335FgTCIikrB0TUsXEFQaY2a7LXf3tBXIIpGUTUo/0PyLN8OSqXDUCDjrP+rfR5R1kpDEvXjdq5csSXebaHj4flX4/nD4/l3CJCHSJGWT4Nlrg5/ffzl4T00IL94Mf/tt8HPNe90v+yjrJCGJ9vtq3y9ZlG6ksw/c/QPgLHf/V3dfEL5uBM5OLkRptpY8k2F6avrpqOskIYn2+2rfL1kUpTsKM7MhKRMnRtxOJL2jRmaYHpF+Ouo6SYhjrIFCGa9AmqUodQYDgQeA/QADPgG+5+7zsh/e7tS0tJnRM4P499HUOKVZimU8g3BH+wG4e047rVMyEBFpvD2uMzCz77r7Iykd1tXMB9RRnYhIc5KuNdE+4Xv7JAIREZHcSVd09l/hj79w920JxSPFJol74JmeS8RF9+KlgEUZ6WyhmX0MzApfr+f6uYE0E0m0m89UyxAXtd+XApexiai7HwF8B1gAnEfQRUV5luOSYpBEu/lMtQxxUft9KXAZk4GZdQWGACcBA4BF1O7FVGTPJNFuPlMtQ1zUfl8KXJQ6g2pgDnCbu2fpz6ro1LS0mdEzA5FENLnOwMyOAb4BnAwcBiwDXnP3++MMNColAxGRxmvKeAZA0JW1mb0PvE9wq+i7wClATpKBiIjEL2MyMLMyYC/gDYLWRCeHHdiJiEgzEaVp6bnuXpn1SEREJGeiNC1VImiOVs2GWb8O3vM5jnyJU6SZi3JlIM1NvhRIJTGYi4hEonEJilG+FEglMZiLiESSrtfSf0y3obs/HX84koiaAqmav7hzVSCVKY58iVOkCDRYZ2Bmf0qznbv797ITUnqqM4hJvhRIJTGYi4jEN7hNvlAyEBFpvCYXnYU7OQ/oDbStmefutzY9PBERyQdROqq7BxgDTCAYA3k00D3Cdg+Y2TozW9jAcjOz35vZcjN718yObWTsIiISkyitiU509wuBT9z9P4ATgJ4RtpsEnJNm+bnA18PXZcAfI+xTIFrb+7JJ8PC3gvd8FkcdQRK1Cqp3kGYuym2ireH7F2Z2KLAB6JxpI3efaWYlaVYZCTzkwUOLt8xsfzPr7O5rI8RUvKK0vU9qQJemSmJwmySOIdIMRLkyeNbM9gduB+YBFcDjMRy7C7AqZXp1OG83ZnaZmZWZWVllZZEXREdpe5/UgC5NlcTgNkkcQ6QZiJIMfunun7r7nwmeFRwJ/DS7YdXm7ve6e6m7l3bq1CnJQ+efKIOoJDWgS1MlMbhNEscQaQaijGcwz92PzTSvgW1LgGfdvU89y/4LeNXdHw+nlwKnZrpNpKalRGt7n9SALk2VxOA2SRxDJM/tcZ2BmR1CcNvmEeACgpZEAF8D7nH3IyMcvISGk8F5wNXAMOB44PfunvF/mZKBiEjjNaXOYCgwDugK/CZl/mfADyMc+HHgVKCjma0GbgZaA7j7PcA0gkSwHPgCGJ9pnyIikh0NJgN3fxB40MxGhc8LGsXdv5NhuQNXNXa/IiISvygPkP9mZveb2XMAZna0mV2c5bhERCRBUZLBn4DpwKHh9HvAddkKSEREkhclGXR096eAagB3rwJ2ZjUqERFJVJRk8LmZHQg4gJkNBjZlNSoREUlUlO4orgemAv9gZn8DOgHnZzUqERFJVMZk4O7zzOwUoBdBrcFSd9+R9chERCQxGZOBmbUFrgS+QXCraJaZ3ePu27IdnIiIJCPKbaKHgM3AH8LpC4CHCcY1EBGRZiBKMujj7kenTL9iZouzFZCIiCQvSmuieWELIgDM7HhAnQOJiDQjUa4MBgJvmNnKcPowYKmZLSDoVaJf1qITEZFEREkG6YauFBGRZiBK09IPkghERERyJ8ozAxERaeaUDERERMlARESUDEREBCUDERFByUBERFAyEBERlAxERAQlAxERQclARERQMhAREZQMREQEJYNma+4Hn3DXK8uZ+8EnuQ5FRApAlC6spcDM/eAT/um+t9heVU2bVi149JLBDOzeIddhiUge05VBM/TWig1sr6qm2mFHVTVvrdiQ65BEJM8pGTRDg3scSJtWLWhp0LpVCwb3ODDXIYlIntNtomZoYPcOPHrJYN5asYHBPQ7ULSIRyUjJoJka2L2DkoCIRKbbRCIikt1kYGbnmNlSM1tuZjfVs3ycmVWaWXn4uiSb8YiISP2ydpvIzFoCdwFnAauBOWY21d0X11n1SXe/OltxSP3mfvCJnimIyC7ZfGYwCFju7isAzOwJYCRQNxlIwlSHICJ1ZfM2URdgVcr06nBeXaPM7F0zm2Jm3erbkZldZmZlZlZWWVmZjViLiuoQRKSuXD9A/m+gxN37AS8CD9a3krvf6+6l7l7aqVOnRANsjlSHICJ1ZfM20YdA6l/6XcN5u7h76p+k9wG/zGI8ElIdgojUlc1kMAf4upkdTpAEvg1ckLqCmXV297Xh5AhgSRbjkRSqQxCRVFlLBu5eZWZXA9OBlsAD7r7IzG4Fytx9KnCNmY0AqoCNwLhsxSMiIg0zd891DI1SWlrqZWVluQ5DRKSgmNlcdy9taHmuHyBLlmQaz+Cxt1cy9v63eeztlVmL4efTlnDq7a/w82nZvfunsRtEmk59EzVDmeoIHnt7JT/8ywIAZi1bD8AFxx8Waww/n7aEe2auANj1ftOwo2I9BqhmQiQuujJohjLVETy3cG3a6Tg8v+ijtNNxUc2ESDyUDJqhTHUE5/bpnHY6Duf0PiTtdFxUMyESDz1AbqYy9T302NsreW7hWs7t0zn2W0Q1fj5tCc8v+ohzeh+SlVtENdTPkkhmmR4gKxmIiBQBtSYSEZGMlAxERETJoDGitGePo817EvtIos4gKaozEGk61RlEFKU9exxt3pPYRxJ1BklRnYFIPHRlEFGU9uxxtHlPYh9J1BkkRXUGIvFQMogoSnv2ONq8J7GPJOoMkqI6A5F4qGlpI0Rpzx5Hm/ck9pFEnUFSVGcgkpnqDERERHUGIiKSmZKBiIgoGYiIiJJBLXEMxpJpH1GKveLYx4X3v82R/+85Lrz/7T06RpTjxFHYlkTxm4rSRDJT0VkojsFYMu0jSrFXHPu48P63mRkum7lsPRfe/zYPXXx8oz5rpuPEUdiWRPGbitJEotGVQSiOwVgy7SNKsVcc+5hdsTHtdJTPmuk4cRS2JVH8pqI0kWiUDEJxDMaSaR9Rir3i2MegkgPSTkf5rJmOE0dhWxLFbypKE4lGdQYp4hiMJdM+ohR7xbGPC+9/m9kVGxlUckCtW0RRjxHlOHEUtiVR/KaiNBEVnYmICCo6ExGRCJQMRESkeJJBIbU1z5eBaQrpnIlI0xRFnUEhtTXPl4FpCumciUjTFcWVQSG1Nc+XgWkK6ZyJSNMVRTIopLbm+TIwTSGdMxFpuqJpWlpIbc3zZWCaQjpnIpKe6gxERER1BiIikllWk4GZnWNmS81suZndVM/yvczsyXD522ZWks14RESkfllLBmbWErgLOBc4GviOmR1dZ7WLgU/c/QjgDuAX2YpHREQals0rg0HAcndf4e7bgSeAkXXWGQk8GP48BTjDzCyLMYmISD2ymQy6AKtSpleH8+pdx92rgE3Abm0YzewyMyszs7LKysoshSsiUrwK4gGyu9/r7qXuXtqpU6dchyMi0uxkszuKD4FuKdNdw3n1rbPazFoB+wFpS13nzp273sw+iDPQRuoIrM/h8RujUGJVnPEqlDihcGJtDnF2T7dhNpPBHODrZnY4wZf+t4EL6qwzFbgIeBM4H3jZMxQ+uHtOLw3MrCxdW918UiixKs54FUqcUDixFkOcWUsG7l5lZlcD04GWwAPuvsjMbgXK3H0qcD/wsJktBzYSJAwREUlYVnstdfdpwLQ6836c8vM2YHQ2YxARkcwK4gFynrk31wE0QqHEqjjjVShxQuHE2uzjLLi+iUREJH66MhARESUDERFRMkjLzFqa2Ttm9mw9y8aZWaWZlYevS3IUY4WZLQhj2K1vbwv8PuwM8F0zOzYXcYaxZIr1VDPblHJOf1zffhKIc38zm2Jm/2tmS8zshDrL8+KcRogzX85nr5QYys3sMzO7rs46OT+nEePMl3P6z2a2yMwWmtnjZta2zvJGdwJaFGMgN8G1wBLgaw0sf9Ldr04wnoac5u4NFZqcC3w9fB0P/DF8z5V0sQLMcvfhiUVTv98Bz7v7+WbWBti7zvJ8OaeZ4oQ8OJ/uvhToD7s6sPwQ+Eud1XJ+TiPGCTk+p2bWBbgGONrdt5rZUwTN8ielrLarE1Az+zZBJ6Bj0u1XVwYNMLOuwHnAfbmOpYlGAg954C1gfzPLzliZzYCZ7QecTFADg7tvd/dP66yW83MaMc58dAbwvrvX7UUg5+e0jobizBetgHZhzw17A2vqLG90J6BKBg37LfCvQHWadUaFl7RTzKxbmvWyyYEXzGyumV1Wz/IoHQYmJVOsACeY2Xwze87MeicZXOhwoBL4U3iL8D4z26fOOvlwTqPECbk/n3V9G3i8nvn5cE5TNRQn5PicuvuHwK+AlcBaYJO7v1BntUidgKZSMqiHmQ0H1rn73DSr/TdQ4u79gBf5Kgsn7RvufizBZfZVZnZyjuKIIlOs84Du7n4M8AfgrwnHB8FfXMcCf3T3AcDnwG4DM+WBKHHmw/ncJbyVNQKYnMs4MskQZ87PqZl1IPjL/3DgUGAfM/tuU/erZFC/IcAIM6sgGIfhdDN7JHUFd9/g7l+Gk/cBA5MNcVccH4bv6wjubw6qs0qUDgMTkSlWd//M3beEP08DWptZx4TDXA2sdve3w+kpBF+6qfLhnGaMM0/OZ6pzgXnu/nE9y/LhnNZoMM48OadnAn9390p33wE8DZxYZ51d59MidgKqZFAPd/83d+/q7iUEl4svu3utzFvnfuYIggfNiTKzfcysfc3PwNnAwjqrTQUuDFtrDCa4pFybcKiRYjWzQ2rua5rZIIJ/n2n/AcfN3T8CVplZr3DWGcDiOqvl/JxGiTMfzmcd36HhWy85P6cpGowzT87pSmCwme0dxnIGu3//1HQCChE7AVVrokaw2p3sXWNmI4Aqgk72xuUgpIOBv4T/NlsBj7n782Z2BYC730PQN9QwYDnwBTA+B3FGjfV84PtmVgVsBb6d6R9wlkwAHg1vF6wAxufpOc0UZ76cz5o/AM4CLk+Zl3fnNEKcOT+n7v62mU0huGVVBbwD3GtN7ARU3VGIiIhuE4mIiJKBiIigZCAiIigZiIgISgYiIoKSgRQ5C3qhrK9X2nrnx3C8b5rZ0SnTr5pZxgHMzaxzHPGYWScze76p+5HmR8lAJFnfBI7OtFI9rgcmNvXg7l4JrDWzIU3dlzQvSgaS18LK5f8JOwZbaGZjwvkDzey1sNO76TUV4eFf2r+zoK/5hWGVKGY2yMzeDDt1eyOlcjdqDA+Y2exw+5Hh/HFm9rSZPW9my8zslynbXGxm74XbTDSzO83sRIJq9dvD+P4hXH10uN57ZnZSA2GMAp4P993SzH4Vfr53zWxCOL/CzH4W7rvMzI4Nz837NYVTob8C/xT180txUAWy5LtzgDXufh4EXTebWWuCTsJGuntlmCD+E/heuM3e7t7fgo7wHgD6AP8LnOTuVWZ2JnAbwRdsFP9OUM7/PTPbH5htZjPCZf2BAcCXwFIz+wOwE/h/BH0FbQZeBua7+xtmNhV41t2nhJ8HoJW7DzKzYcDNBH3P7GJmhxP0TV/TF9ZlQAnQP/w8B6SsvjL87HcQ9G8/BGhL0PXHPeE6ZcBPI352KRJKBpLvFgC/NrNfEHyJzjKzPgRf8C+GX6YtCbryrfE4gLvPNLOvhV/g7YEHzezrBF1pt25EDGcTdFz4L+F0W+Cw8OeX3H0TgJktBroDHYHX3H1jOH8y0DPN/p8O3+cSfMnX1Zmgu+oaZwL3hF0TU3Oc0NTwfQGwr7tvBjab2Zdmtn845sE6gt4uRXZRMpC85u7vWTAE4jDgp2b2EkGPp4vc/YSGNqtn+ifAK+7+LQuGAHy1EWEYMCocCeurmWbHE1wR1NjJnv2fqtlHQ9tvJUhAjdlXdZ3YqlP23Tbcp8guemYgec3MDgW+cPdHgNsJbr0sBTpZOOavmbW22oOM1DxX+AZB75ebCLrwrekSeVwjw5gOTDDb1VvlgAzrzwFOMbMOFnQfnHo7ajPBVUpjvEftK4YXgcvDfVPnNlEUPdm9d1spckoGku/6EtyjLye4n/5Td99O0HvkL8xsPlBO7f7ct5nZOwT3yC8O5/0S+Fk4v7F/vf+E4LbSu2a2KJxuUDhuw23AbOBvQAXBSFMQjI/xg/BB9D/Uv4fd9vc58L6ZHRHOuo+gG+N3w89/QeM+DqcB/9PIbaSZU6+l0qyY2avAv7h7WY7j2Nfdt4R/vf8FeMDd6xtcPer+vgUMdPcfxRDbTIKH7580dV/SfOjKQCQ7bgmvZhYCf6eJwyOGiaSiqUGZWSfgN0oEUpeuDERERFcGIiKiZCAiIigZiIgISgYiIoKSgYiIAP8fwFftGKsbHCEAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for j in [1, 2, 3]:\n", - " for i, class_name in enumerate(iris.target_names):\n", - " sepal_length = iris.data[:, 0][iris.target == i]\n", - " sepal_width = iris.data[:, j][iris.target == i]\n", - " plt.plot(sepal_length, sepal_width, '.', label=class_name)\n", - "\n", - " plt.title(\"Flowers\")\n", - " plt.xlabel(iris_features[0])\n", - " plt.ylabel(iris_features[j])\n", - " plt.legend()\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "driven-animation", - "metadata": {}, - "source": [ - "## Plotting decision boundaries\n", - "\n", - "Decision boundaries allows us to visualize how given classifier thinks data should be splitted into a different classes\n", - "\n", - "For this let's focus on first 2 features ('sepal length (cm)', 'sepal width (cm)') to have consistent 2D plot" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "accurate-central", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_decision(clf, title):\n", - " x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n", - " y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n", - " xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),\n", - " np.arange(y_min, y_max, 0.1))\n", - "\n", - " Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n", - " Z = Z.reshape(xx.shape)\n", - "\n", - " plt.contourf(xx, yy, Z, alpha=0.4)\n", - "\n", - " for i, class_name in enumerate(iris.target_names):\n", - " sepal_length = iris.data[:, 0][iris.target == i]\n", - " sepal_width = iris.data[:, 1][iris.target == i]\n", - " plt.plot(sepal_length, sepal_width, '.', label=class_name)\n", - "\n", - " plt.title(title)\n", - " plt.xlabel(iris_features[0])\n", - " plt.ylabel(iris_features[j])\n", - " plt.legend()\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "intellectual-proxy", - "metadata": {}, - "outputs": [], - "source": [ - "# Select first 2 features\n", - "X = iris.data[:, [0, 1]]\n", - "y = iris.target" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "meaning-conversion", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "l_regression = LogisticRegression()\n", - "l_regression = l_regression.fit(X, y)\n", - "plot_decision(l_regression, title=\"Log regression\")" - ] - }, - { - "cell_type": "markdown", - "id": "suitable-greene", - "metadata": {}, - "source": [ - "We can see that `LogisticRegression`model cannot properly divide 'versicolor' and 'virginica' classes based on that 2 features\n", - "\n", - "To divide classes properly we need to introduce non-linear models such and Neural Networks or Decision Trees" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "retained-crossing", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "tree = DecisionTreeClassifier()\n", - "tree = tree.fit(X, y)\n", - "plot_decision(tree, title=\"Decision Tree\")" - ] - }, - { - "cell_type": "markdown", - "id": "olympic-peeing", - "metadata": {}, - "source": [ - "# Train-Test split" - ] - }, - { - "cell_type": "markdown", - "id": "great-ferry", - "metadata": {}, - "source": [ - "Let's now evaluate model using [test-train split](https://machinelearningmastery.com/train-test-split-for-evaluating-machine-learning-algorithms/) approach\n", - "\n", - "This is a common technique for checking model generalization. \n", - "You train model on some part of the dataset (lets say 67%, or 75%) and that you check if you model generalizes well by prediction on data that left \n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "noble-compression", - "metadata": {}, - "outputs": [], - "source": [ - "X = iris.data # Use all iris features as predictors\n", - "y = iris.target" - ] - }, - { - "cell_type": "markdown", - "id": "studied-professor", - "metadata": {}, - "source": [ - "Split data randomly using [train_test_split](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)\n", - "\n", - "Set `test_size=0.25` to use 25% data for test and 75% for train" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "intelligent-quest", - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(\n", - " X, y, test_size=0.25, random_state=117\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "weird-hamburg", - "metadata": {}, - "outputs": [], - "source": [ - "# function for printing results\n", - "def eval_model(clf, X_test, y_test):\n", - " pred = clf.predict(X_test)\n", - " accuracy = np.mean(pred == y_test)\n", - " print(f\"Model accuracy: {accuracy*100:0.2f}%\")\n", - " df = pd.DataFrame(confusion_matrix(y_test, pred))\n", - " df.columns = [\"Classified as \" + x for x in iris.target_names]\n", - " df.index = iris.target_names\n", - " return df" - ] - }, - { - "cell_type": "markdown", - "id": "velvet-bench", - "metadata": {}, - "source": [ - "Train model on `train` data " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "wanted-devil", - "metadata": {}, - "outputs": [], - "source": [ - "l_regression = LogisticRegression()\n", - "l_regression = l_regression.fit(X_train, y_train)" - ] - }, - { - "cell_type": "markdown", - "id": "outdoor-firewall", - "metadata": {}, - "source": [ - "And evaluate on `test` data " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "several-ballet", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model accuracy: 94.74%\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Classified as setosaClassified as versicolorClassified as virginica
setosa1400
versicolor080
virginica0214
\n", - "
" - ], - "text/plain": [ - " Classified as setosa Classified as versicolor \\\n", - "setosa 14 0 \n", - "versicolor 0 8 \n", - "virginica 0 2 \n", - "\n", - " Classified as virginica \n", - "setosa 0 \n", - "versicolor 0 \n", - "virginica 14 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval_model(l_regression, X_test, y_test)" - ] - }, - { - "cell_type": "markdown", - "id": "wound-aircraft", - "metadata": {}, - "source": [ - "You should see accuracy close to 100% as Iris is quite easy dataset where data can be almost perfectly classified if all 4 features used\n", - "\n", - "Using confusion matrics printed above you may also see that all examples of 'setosa' classified as 'setosa',, while there are some errors between 'versicolor'-'virginica' classes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "confident-admission", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/tasks/task_1/Classification_example_with_Iris_dataset.py b/tasks/task_1/Classification_example_with_Iris_dataset.py deleted file mode 100644 index a642673..0000000 --- a/tasks/task_1/Classification_example_with_Iris_dataset.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[1]: - - -import pandas as pd -import numpy as np - -from sklearn import datasets -from matplotlib import pyplot as plt - -from sklearn.linear_model import LogisticRegression -from sklearn.tree import DecisionTreeClassifier -from sklearn.model_selection import train_test_split -from sklearn.metrics import confusion_matrix - - -# In[2]: - - -get_ipython().run_line_magic('load_ext', 'pycodestyle_magic') -get_ipython().run_line_magic('flake8_on', '') - - -# # Classification example with Iris dataset - -# This example dataset task is in classifying flower based on its features - -# In[3]: - - -# This dataset boult in `sklearn` library so you can load it directly -iris = datasets.load_iris() -iris_features = iris['feature_names'] - - -# Print all flowers and features - -# In[4]: - - -print(f"Dataset features:\n{iris['feature_names']}") -print(f"Dataset classes:\n{iris.target_names}") - - -# Now we should visually analyze the dataset -# -# As we are limited by 2D displays and cannot visualize 4d data in a single plot - let's print data 2-axis at a time - -# In[5]: - - -for j in [1, 2, 3]: - for i, class_name in enumerate(iris.target_names): - sepal_length = iris.data[:, 0][iris.target == i] - sepal_width = iris.data[:, j][iris.target == i] - plt.plot(sepal_length, sepal_width, '.', label=class_name) - - plt.title("Flowers") - plt.xlabel(iris_features[0]) - plt.ylabel(iris_features[j]) - plt.legend() - plt.show() - - -# ## Plotting decision boundaries -# -# Decision boundaries allows us to visualize how given classifier thinks data should be splitted into a different classes -# -# For this let's focus on first 2 features ('sepal length (cm)', 'sepal width (cm)') to have consistent 2D plot - -# In[6]: - - -def plot_decision(clf, title): - x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 - y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 - xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), - np.arange(y_min, y_max, 0.1)) - - Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) - Z = Z.reshape(xx.shape) - - plt.contourf(xx, yy, Z, alpha=0.4) - - for i, class_name in enumerate(iris.target_names): - sepal_length = iris.data[:, 0][iris.target == i] - sepal_width = iris.data[:, 1][iris.target == i] - plt.plot(sepal_length, sepal_width, '.', label=class_name) - - plt.title(title) - plt.xlabel(iris_features[0]) - plt.ylabel(iris_features[j]) - plt.legend() - plt.show() - - -# In[7]: - - -# Select first 2 features -X = iris.data[:, [0, 1]] -y = iris.target - - -# In[8]: - - -l_regression = LogisticRegression() -l_regression = l_regression.fit(X, y) -plot_decision(l_regression, title="Log regression") - - -# We can see that `LogisticRegression`model cannot properly divide 'versicolor' and 'virginica' classes based on that 2 features -# -# To divide classes properly we need to introduce non-linear models such and Neural Networks or Decision Trees - -# In[9]: - - -tree = DecisionTreeClassifier() -tree = tree.fit(X, y) -plot_decision(tree, title="Decision Tree") - - -# # Train-Test split - -# Let's now evaluate model using [test-train split](https://machinelearningmastery.com/train-test-split-for-evaluating-machine-learning-algorithms/) approach -# -# This is a common technique for checking model generalization. -# You train model on some part of the dataset (lets say 67%, or 75%) and that you check if you model generalizes well by prediction on data that left -# - -# In[10]: - - -X = iris.data # Use all iris features as predictors -y = iris.target - - -# Split data randomly using [train_test_split](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) -# -# Set `test_size=0.25` to use 25% data for test and 75% for train - -# In[11]: - - -X_train, X_test, y_train, y_test = train_test_split( - X, y, test_size=0.25, random_state=117 -) - - -# In[12]: - - -# function for printing results -def eval_model(clf, X_test, y_test): - pred = clf.predict(X_test) - accuracy = np.mean(pred == y_test) - print(f"Model accuracy: {accuracy*100:0.2f}%") - df = pd.DataFrame(confusion_matrix(y_test, pred)) - df.columns = ["Classified as " + x for x in iris.target_names] - df.index = iris.target_names - return df - - -# Train model on `train` data - -# In[13]: - - -l_regression = LogisticRegression() -l_regression = l_regression.fit(X_train, y_train) - - -# And evaluate on `test` data - -# In[14]: - - -eval_model(l_regression, X_test, y_test) - - -# You should see accuracy close to 100% as Iris is quite easy dataset where data can be almost perfectly classified if all 4 features used -# -# Using confusion matrics printed above you may also see that all examples of 'setosa' classified as 'setosa',, while there are some errors between 'versicolor'-'virginica' classes - -# In[ ]: - - - - diff --git a/tasks/task_1/README.md b/tasks/task_1/README.md deleted file mode 100644 index fa5cb73..0000000 --- a/tasks/task_1/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Classification example with Iris dataset - -Basic example for visualizing data and classifiers training From 2ddca465e49ea63d90c55d614bbef5139b266719 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:47:05 +0200 Subject: [PATCH 11/21] Add files via upload --- .../House price/artembielov_house_price.py | 58 ++ .../House price/model_v3.ipynb | 977 ++++++++++++++++++ .../Titanic/artembielov_titanic.py | 21 + .../artembielov_task1/Titanic/model_v1.ipynb | 693 +++++++++++++ tasks/artembielov_task2/artembielov_mask.py | 94 ++ tasks/artembielov_task2/metrics.txt | 120 +++ .../artembielov_task3/artembielov_mask(TL).py | 79 ++ tasks/artembielov_task3/metrics2.txt | 120 +++ .../artembielov_face_recognition.py | 79 ++ 9 files changed, 2241 insertions(+) create mode 100644 tasks/artembielov_task1/House price/artembielov_house_price.py create mode 100644 tasks/artembielov_task1/House price/model_v3.ipynb create mode 100644 tasks/artembielov_task1/Titanic/artembielov_titanic.py create mode 100644 tasks/artembielov_task1/Titanic/model_v1.ipynb create mode 100644 tasks/artembielov_task2/artembielov_mask.py create mode 100644 tasks/artembielov_task2/metrics.txt create mode 100644 tasks/artembielov_task3/artembielov_mask(TL).py create mode 100644 tasks/artembielov_task3/metrics2.txt create mode 100644 tasks/artembielov_task4/artembielov_face_recognition.py diff --git a/tasks/artembielov_task1/House price/artembielov_house_price.py b/tasks/artembielov_task1/House price/artembielov_house_price.py new file mode 100644 index 0000000..4cfeb1a --- /dev/null +++ b/tasks/artembielov_task1/House price/artembielov_house_price.py @@ -0,0 +1,58 @@ +import pandas as pd +import numpy as np +from sklearn.ensemble import RandomForestRegressor +from sklearn.ensemble import GradientBoostingRegressor +from sklearn.neural_network import MLPRegressor +from sklearn.linear_model import Ridge +from sklearn.linear_model import LinearRegression +from mlxtend.regressor import StackingRegressor + + +path = 'D:/projects/Python/Samsung2/House price/data/' +test = pd.read_csv(path + 'test.csv') +train = pd.read_csv(path + 'train.csv') + +target = np.log(train.SalePrice) + + +all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition'])) + +all_data = all_data.drop(['Utilities'], axis=1) + +useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence'] +all_data.drop(useless, axis=1) + + +def encode(x): + return 1 if x == 'Partial' else 0 + + +all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True) +all_data['enc_condition'] = all_data.SaleCondition.apply(encode) + +data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna() +data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna() + +X_train = data_train +X_test = data_test +y = target + +lr = LinearRegression(n_jobs=-1) +rd = Ridge(alpha=4.84) +rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1) +gb = GradientBoostingRegressor(n_estimators=40, max_depth=2) +nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75) + +model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr) + +model.fit(X_train, y) + +y_pred = model.predict(X_train) + +Y_pred = model.predict(X_test) + +final_predictions = np.exp(Y_pred) +submission = pd.DataFrame() +submission['Id'] = test['Id'] +submission['SalePrice'] = final_predictions +submission.to_csv('submission_v3.csv', index=False) diff --git a/tasks/artembielov_task1/House price/model_v3.ipynb b/tasks/artembielov_task1/House price/model_v3.ipynb new file mode 100644 index 0000000..47ec728 --- /dev/null +++ b/tasks/artembielov_task1/House price/model_v3.ipynb @@ -0,0 +1,977 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "test = pd.read_csv(\"data/test.csv\")\n", + "train = pd.read_csv(\"data/train.csv\")\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fix skewness(log)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "target = np.log(train.SalePrice) \n" + ] + }, + { + "cell_type": "heading", + "metadata": { + "collapsed": false + }, + "level": 1, + "source": [ + "Explore correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Id int64\nMSSubClass int64\nLotFrontage float64\nLotArea int64\nOverallQual int64\nOverallCond int64\nYearBuilt int64\nYearRemodAdd int64\nMasVnrArea float64\nBsmtFinSF1 int64\nBsmtFinSF2 int64\nBsmtUnfSF int64\nTotalBsmtSF int64\n1stFlrSF int64\n2ndFlrSF int64\nLowQualFinSF int64\nGrLivArea int64\nBsmtFullBath int64\nBsmtHalfBath int64\nFullBath int64\nHalfBath int64\nBedroomAbvGr int64\nKitchenAbvGr int64\nTotRmsAbvGrd int64\nFireplaces int64\nGarageYrBlt float64\nGarageCars int64\nGarageArea int64\nWoodDeckSF int64\nOpenPorchSF int64\nEnclosedPorch int64\n3SsnPorch int64\nScreenPorch int64\nPoolArea int64\nMiscVal int64\nMoSold int64\nYrSold int64\nSalePrice int64\ndtype: object\nSalePrice 1.000000\nOverallQual 0.790982\nGrLivArea 0.708624\nGarageCars 0.640409\nGarageArea 0.623431\nName: SalePrice, dtype: float64 \n\nYrSold -0.028923\nOverallCond -0.077856\nMSSubClass -0.084284\nEnclosedPorch -0.128578\nKitchenAbvGr -0.135907\nName: SalePrice, dtype: float64\n" + ] + } + ], + "source": [ + "\n", + "numeric_features = train.select_dtypes(include=[np.number])\n", + "print(numeric_features.dtypes)\n", + "\n", + "corr = numeric_features.corr()\n", + "print(corr['SalePrice'].sort_values(ascending=False)[:5], '\\n')\n", + "print(corr['SalePrice'].sort_values(ascending=False)[-5:])\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Explore null data" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Null Count\nFeature \nPoolQC 1453\nMiscFeature 1406\nAlley 1369\nFence 1179\nFireplaceQu 690\nLotFrontage 259\nGarageYrBlt 81\nGarageCond 81\nGarageType 81\nGarageFinish 81\nGarageQual 81\nBsmtFinType2 38\nBsmtExposure 38\nBsmtQual 37\nBsmtCond 37\nBsmtFinType1 37\nMasVnrArea 8\nMasVnrType 8\nElectrical 1\nId 0\nFunctional 0\nFireplaces 0\nKitchenQual 0\nKitchenAbvGr 0\nBedroomAbvGr 0\n" + ] + } + ], + "source": [ + "nulls = pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])\n", + "nulls.columns = ['Null Count']\n", + "nulls.index.name = 'Feature'\n", + "print(nulls)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Drop useless data" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MSSubClassMSZoningLotFrontageLotAreaStreetLotShapeLandContourLotConfigLandSlopeNeighborhood...OpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSaleTypeSaleCondition
060RL65.08450PaveRegLvlInsideGtlCollgCr...610000022008WDNormal
120RL80.09600PaveRegLvlFR2GtlVeenker...00000052007WDNormal
260RL68.011250PaveIR1LvlInsideGtlCollgCr...420000092008WDNormal
370RL60.09550PaveIR1LvlCornerGtlCrawfor...35272000022006WDAbnorml
460RL84.014260PaveIR1LvlFR2GtlNoRidge...8400000122008WDNormal
..................................................................
1454160RM21.01936PaveRegLvlInsideGtlMeadowV...00000062006WDNormal
1455160RM21.01894PaveRegLvlInsideGtlMeadowV...240000042006WDAbnorml
145620RL160.020000PaveRegLvlInsideGtlMitchel...00000092006WDAbnorml
145785RL62.010441PaveRegLvlInsideGtlMitchel...32000070072006WDNormal
145860RL74.09627PaveRegLvlInsideModMitchel...4800000112006WDNormal
\n", + "

2919 rows × 74 columns

\n", + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_data = pd.concat((train.loc[:, 'MSSubClass':'SaleCondition'], test.loc[:, 'MSSubClass':'SaleCondition']))\n", + "\n", + "all_data = all_data.drop(['Utilities'], axis=1)\n", + "\n", + "useless = ['PoolQC', 'MiscFeature', 'Alley', 'Fence']\n", + "all_data.drop(useless, axis=1)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Using one-hot encoding to engineer fetures: 'Street', 'SaleCondition'" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "'Street'" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original: \n\nPave 2907\nGrvl 12\nName: Street, dtype: int64 \n\nEncoded: \n\n1 2907\n0 12\nName: enc_street, dtype: int64\n" + ] + } + ], + "source": [ + "print(\"Original: \\n\")\n", + "print(all_data.Street.value_counts(), \"\\n\")\n", + "\n", + "\n", + "def encode(x):\n", + " return 1 if x == 'Partial' else 0\n", + "\n", + "\n", + "all_data['enc_street'] = pd.get_dummies(all_data.Street, drop_first=True)\n", + "all_data['enc_condition'] = all_data.SaleCondition.apply(encode)\n", + "\n", + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print ('Encoded: \\n')\n", + "print (all_data.enc_street.value_counts())\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Remove null-data" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + } + ], + "source": [ + "data_train = all_data[:train.shape[0]].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "data_test = all_data[train.shape[0]:].select_dtypes(include=[np.number]).interpolate().dropna()\n", + "\n", + "print(sum(data_train.isnull().sum() != 0)) \n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Linear model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", + "from sklearn.neural_network import MLPRegressor\n", + "from sklearn.linear_model import Ridge\n", + "from sklearn.linear_model import LinearRegression\n", + "from mlxtend.regressor import StackingRegressor\n", + "\n", + "\n", + "X_train = data_train\n", + "X_test = data_test\n", + "y = target\n", + "\n", + "lr = LinearRegression(n_jobs=-1)\n", + "rd = Ridge(alpha=4.84)\n", + "rf = RandomForestRegressor(n_estimators=12, max_depth=3, n_jobs=-1)\n", + "gb = GradientBoostingRegressor(n_estimators=40, max_depth=2)\n", + "nn = MLPRegressor(hidden_layer_sizes=(90, 90), alpha=2.75)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "\n", + "Initialize linear regression model" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "model = StackingRegressor(regressors=[rf, gb, nn, rd], meta_regressor=lr)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Fit model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.fit(X_train, y)\n" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 1, + "source": [ + "Make a submission" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "ename": "NotFittedError", + "evalue": "This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mY_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfinal_predictions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\regressor\\stacking_regression.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mPredicted\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \"\"\"\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_is_fitted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'regr_'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0mmeta_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_meta_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mD:\\projects\\Python\\Samsung2\\venv\\lib\\site-packages\\mlxtend\\externals\\estimator_checks.py\u001b[0m in \u001b[0;36mcheck_is_fitted\u001b[0;34m(estimator, attributes, msg, all_or_any)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mall_or_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mattr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mattributes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFittedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNotFittedError\u001b[0m: This StackingRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this method." + ], + "output_type": "error" + } + ], + "source": [ + "y_pred = model.predict(X_train)\n", + "\n", + "Y_pred = model.predict(X_test)\n", + "\n", + "final_predictions = np.exp(Y_pred)\n", + "submission = pd.DataFrame()\n", + "submission['Id'] = test['Id']\n", + "submission['SalePrice'] = final_predictions\n", + "submission.to_csv('submission_v3.csv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tasks/artembielov_task1/Titanic/artembielov_titanic.py b/tasks/artembielov_task1/Titanic/artembielov_titanic.py new file mode 100644 index 0000000..bfd0f87 --- /dev/null +++ b/tasks/artembielov_task1/Titanic/artembielov_titanic.py @@ -0,0 +1,21 @@ +import pandas as pd +from sklearn.ensemble import RandomForestClassifier + + +path = 'D:/projects/Python/Samsung2/Titanic/data/' + +train_data = pd.read_csv(path + "train.csv") +test_data = pd.read_csv(path + "test.csv") + +y = train_data["Survived"] + +features = ["Pclass", "Sex", "SibSp", "Parch"] +X = pd.get_dummies(train_data[features]) +X_test = pd.get_dummies(test_data[features]) + +model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) +model.fit(X, y) +predictions = model.predict(X_test) + +output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions}) +output.to_csv('my_submission.csv', index=False) diff --git a/tasks/artembielov_task1/Titanic/model_v1.ipynb b/tasks/artembielov_task1/Titanic/model_v1.ipynb new file mode 100644 index 0000000..0fb309c --- /dev/null +++ b/tasks/artembielov_task1/Titanic/model_v1.ipynb @@ -0,0 +1,693 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", + "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.651550Z", + "iopub.status.busy": "2021-01-25T14:39:05.650747Z", + "iopub.status.idle": "2021-01-25T14:39:05.656260Z", + "shell.execute_reply": "2021-01-25T14:39:05.655743Z" + }, + "papermill": { + "duration": 0.018492, + "end_time": "2021-01-25T14:39:05.656405", + "exception": false, + "start_time": "2021-01-25T14:39:05.637913", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd \n", + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "\n", + "path = 'D:/projects/Python/Samsung2/Titanic/data/'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.674687Z", + "iopub.status.busy": "2021-01-25T14:39:05.673983Z", + "iopub.status.idle": "2021-01-25T14:39:05.716139Z", + "shell.execute_reply": "2021-01-25T14:39:05.715681Z" + }, + "papermill": { + "duration": 0.053652, + "end_time": "2021-01-25T14:39:05.716241", + "exception": false, + "start_time": "2021-01-25T14:39:05.662589", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_data = pd.read_csv(path + \"train.csv\")\n", + "train_data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.740555Z", + "iopub.status.busy": "2021-01-25T14:39:05.735599Z", + "iopub.status.idle": "2021-01-25T14:39:05.755816Z", + "shell.execute_reply": "2021-01-25T14:39:05.756321Z" + }, + "papermill": { + "duration": 0.032416, + "end_time": "2021-01-25T14:39:05.756473", + "exception": false, + "start_time": "2021-01-25T14:39:05.724057", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", + "
" + ], + "text/plain": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
\n", + "
" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_data = pd.read_csv(path + \"test.csv\")\n", + "test_data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.777922Z", + "iopub.status.busy": "2021-01-25T14:39:05.777250Z", + "iopub.status.idle": "2021-01-25T14:39:05.781165Z", + "shell.execute_reply": "2021-01-25T14:39:05.781695Z" + }, + "papermill": { + "duration": 0.018524, + "end_time": "2021-01-25T14:39:05.781858", + "exception": false, + "start_time": "2021-01-25T14:39:05.763334", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% of women who survived: 0.7420382165605095\n" + ] + } + ], + "source": [ + "women = train_data.loc[train_data.Sex == 'female'][\"Survived\"]\n", + "rate_women = sum(women)/len(women)\n", + "\n", + "print(\"% of women who survived:\", rate_women)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.803850Z", + "iopub.status.busy": "2021-01-25T14:39:05.803169Z", + "iopub.status.idle": "2021-01-25T14:39:05.807022Z", + "shell.execute_reply": "2021-01-25T14:39:05.807547Z" + }, + "papermill": { + "duration": 0.01846, + "end_time": "2021-01-25T14:39:05.807679", + "exception": false, + "start_time": "2021-01-25T14:39:05.789219", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% of men who survived: 0.18890814558058924\n" + ] + } + ], + "source": [ + "men = train_data.loc[train_data.Sex == 'male'][\"Survived\"]\n", + "rate_men = sum(men)/len(men)\n", + "\n", + "print(\"% of men who survived:\", rate_men)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2021-01-25T14:39:05.831772Z", + "iopub.status.busy": "2021-01-25T14:39:05.831113Z", + "iopub.status.idle": "2021-01-25T14:39:07.616680Z", + "shell.execute_reply": "2021-01-25T14:39:07.616040Z" + }, + "papermill": { + "duration": 1.80116, + "end_time": "2021-01-25T14:39:07.616814", + "exception": false, + "start_time": "2021-01-25T14:39:05.815654", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your submission was successfully saved!\n" + ] + } + ], + "source": [ + "y = train_data[\"Survived\"]\n", + "\n", + "features = [\"Pclass\", \"Sex\", \"SibSp\", \"Parch\"]\n", + "X = pd.get_dummies(train_data[features])\n", + "X_test = pd.get_dummies(test_data[features])\n", + "\n", + "model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)\n", + "model.fit(X, y)\n", + "predictions = model.predict(X_test)\n", + "\n", + "output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})\n", + "output.to_csv('my_submission.csv', index=False)\n", + "print(\"Your submission was successfully saved!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6" + }, + "papermill": { + "duration": 6.81406, + "end_time": "2021-01-25T14:39:07.733035", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2021-01-25T14:39:00.918975", + "version": "2.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tasks/artembielov_task2/artembielov_mask.py b/tasks/artembielov_task2/artembielov_mask.py new file mode 100644 index 0000000..2bbc09c --- /dev/null +++ b/tasks/artembielov_task2/artembielov_mask.py @@ -0,0 +1,94 @@ +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 180 +img_width = 180 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', + batch_size=batch_size, + image_size=(img_height,img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', + batch_size=batch_size, + image_size=(img_height,img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + + +def normalize(image, label): + image = tf.cast(image/255., tf.float32) + return image, label + + +class_names = ds_train.class_names +ds_train = ds_train.map(normalize) +ds_val = ds_val.map(normalize) + +AUTOTUNE = tf.data.AUTOTUNE + +ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait = True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, + epochs=10, + validation_data=ds_val, + callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, + epochs=10, + validation_data=ds_val) diff --git a/tasks/artembielov_task2/metrics.txt b/tasks/artembielov_task2/metrics.txt new file mode 100644 index 0000000..e615532 --- /dev/null +++ b/tasks/artembielov_task2/metrics.txt @@ -0,0 +1,120 @@ +1 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [3.0301003456115723], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5101770758628845], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6946433186531067], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +2 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1666980981826782], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6932384371757507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +3 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6767988801002502], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9144464731216431], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3698585033416748], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9271523356437683], 'step': 0}]}}} +score: 0.9271523356437683 + +4 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5767467021942139], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8542115092277527], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.43192484974861145], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.874834418296814], 'step': 0}]}}} +score: 0.874834418296814 + +5 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517143726348877], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8977329134941101], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26716887950897217], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9192053079605103], 'step': 0}]}}} +score: 0.9192053079605103 + +6 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.627263069152832], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9040212035179138], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.44108766317367554], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8999999761581421], 'step': 0}]}}} +score: 0.8999999761581421 + +7 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6655551791191101], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9402614831924438], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31707772612571716], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9370861053466797], 'step': 0}]}}} +score: 0.9370861053466797 + +8 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5643975138664246], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8945887684822083], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2649300992488861], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} +score: 0.8960264921188354 + +9 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5805342197418213], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8858183026313782], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31061357259750366], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9059602618217468], 'step': 0}]}}} +score: 0.9059602618217468 + +10 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5670236349105835], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8628164529800415], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41568616032600403], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8741722106933594], 'step': 0}]}}} +score: 0.8741722106933594 + +11 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6804172396659851], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8922720551490784], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.265455424785614], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9006622433662415], 'step': 0}]}}} +score: 0.9006622433662415 + +12 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.48696476221084595], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8876385688781738], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26986125111579895], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9079470038414001], 'step': 0}]}}} +score: 0.9079470038414001 + +13 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5567178130149841], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9182525277137756], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3633168339729309], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9251655340194702], 'step': 0}]}}} +score: 0.9251655340194702 + +14 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5764991641044617], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8808538913726807], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31189629435539246], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +15 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6970908641815186], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8904517889022827], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.571384847164154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +16 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [8.397660255432129], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5062054991722107], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6948115229606628], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +17 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [2.28014874458313], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6157537698745728], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6675699353218079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6476821303367615], 'step': 0}]}}} +score: 0.6476821303367615 + +18 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4543749988079071], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9220585823059082], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.24996311962604523], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.926490068435669], 'step': 0}]}}} +score: 0.926490068435669 + +19 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6190159320831299], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4576696455478668], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9291390776634216], 'step': 0}]}}} +score: 0.9291390776634216 + +20 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46962010860443115], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8851563930511475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30790144205093384], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9092715382575989], 'step': 0}]}}} +score: 0.9092715382575989 + +21 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5608833432197571], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8878040909767151], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2994978427886963], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +22 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6217741370201111], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8616580963134766], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4590270519256592], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8801324367523193], 'step': 0}]}}} +score: 0.8801324367523193 + +23 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.547469437122345], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8735727071762085], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3508225679397583], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8913907408714294], 'step': 0}]}}} +score: 0.8913907408714294 + +24 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.179666042327881], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5177891850471497], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6952712535858154], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +25 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5122357606887817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9543273448944092], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.32478758692741394], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9430463314056396], 'step': 0}]}}} +score: 0.9430463314056396 + +26 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5002010464668274], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8972364664077759], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.2633877694606781], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9172185659408569], 'step': 0}]}}} +score: 0.9172185659408569 + +27 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4500119686126709], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9329802989959717], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31237509846687317], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.934437096118927], 'step': 0}]}}} +score: 0.934437096118927 + +28 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [6.882015705108643], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.5086877346038818], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.693439245223999], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.499337762594223], 'step': 0}]}}} +score: 0.499337762594223 + +29 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [1.1582846641540527], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7982789874076843], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6303998231887817], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8695363998413086], 'step': 0}]}}} +score: 0.8695363998413086 + +30 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6176189184188843], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9756743311882019], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.29317381978034973], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9490066170692444], 'step': 0}]}}} +score: 0.9490066170692444 + diff --git a/tasks/artembielov_task3/artembielov_mask(TL).py b/tasks/artembielov_task3/artembielov_mask(TL).py new file mode 100644 index 0000000..84c0298 --- /dev/null +++ b/tasks/artembielov_task3/artembielov_mask(TL).py @@ -0,0 +1,79 @@ +import tensorflow_hub as hub +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + + +model_name = 'model_v3.h5' +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 224 +img_width = 224 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + +class_names = ds_train.class_names + +feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" +feature_extractor_layer = hub.KerasLayer( + feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + feature_extractor_layer, + tf.keras.layers.Dense(num_classes), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, epochs=10, validation_data=ds_val) + +model.save('models/' + model_name) diff --git a/tasks/artembielov_task3/metrics2.txt b/tasks/artembielov_task3/metrics2.txt new file mode 100644 index 0000000..e98cff5 --- /dev/null +++ b/tasks/artembielov_task3/metrics2.txt @@ -0,0 +1,120 @@ +1 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.517565131187439], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28460147976875305], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8960264921188354], 'step': 0}]}}} +score: 0.8960264921188354 + +2 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6755658388137817], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.640906810760498], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6557091474533081], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.6900662183761597], 'step': 0}]}}} +score: 0.6900662183761597 + +3 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43988722562789917], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9091510772705078], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3098181188106537], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9145695567131042], 'step': 0}]}}} +score: 0.9145695567131042 + +4 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5314217209815979], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8613271713256836], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3702387809753418], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.878145694732666], 'step': 0}]}}} +score: 0.878145694732666 + +5 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5134807229042053], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8576865792274475], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.37029528617858887], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8721854090690613], 'step': 0}]}}} +score: 0.8721854090690613 + +6 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6944428086280823], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8555353283882141], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6856627464294434], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8556291460990906], 'step': 0}]}}} +score: 0.8556291460990906 + +7 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.44080615043640137], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.883336067199707], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27165472507476807], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8900662064552307], 'step': 0}]}}} +score: 0.8900662064552307 + +8 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.47215789556503296], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8778752088546753], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.30887502431869507], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8768212199211121], 'step': 0}]}}} +score: 0.8768212199211121 + +9 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6760485172271729], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7871918082237244], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6525512933731079], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} +score: 0.8231788277626038 + +10 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.49988970160484314], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8692702054977417], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34235015511512756], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} +score: 0.8834437131881714 + +11 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6665294170379639], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6789674162864685], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.634369432926178], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7152317762374878], 'step': 0}]}}} +score: 0.7152317762374878 + +12 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5008093118667603], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8790335655212402], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34613117575645447], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8814569711685181], 'step': 0}]}}} +score: 0.8814569711685181 + +13 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6921001672744751], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8755584955215454], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6828383803367615], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8754966855049133], 'step': 0}]}}} +score: 0.8754966855049133 + +14 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5217590928077698], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.894092321395874], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3539324402809143], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9033112525939941], 'step': 0}]}}} +score: 0.9033112525939941 + +15 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5118488669395447], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.41935527324676514], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.865562915802002], 'step': 0}]}}} +score: 0.865562915802002 + +16 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5413548350334167], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.922389566898346], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.34384459257125854], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} +score: 0.9165562987327576 + +17 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6866899728775024], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7708091735839844], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6696961522102356], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8231788277626038], 'step': 0}]}}} +score: 0.8231788277626038 + +18 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4633551239967346], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8883005380630493], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.26650261878967285], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9039735198020935], 'step': 0}]}}} +score: 0.9039735198020935 + +19 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5202623605728149], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.4311300218105316], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8966887593269348], 'step': 0}]}}} +score: 0.8966887593269348 + +20 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5793002247810364], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8548734188079834], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.40468114614486694], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8834437131881714], 'step': 0}]}}} +score: 0.8834437131881714 + +21 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6710097193717957], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7031275629997253], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6361395120620728], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7543046474456787], 'step': 0}]}}} +score: 0.7543046474456787 + +22 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4336754083633423], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9278504252433777], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3586457371711731], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9165562987327576], 'step': 0}]}}} +score: 0.9165562987327576 + +23 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.46024826169013977], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9197418689727783], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3174518942832947], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9125827550888062], 'step': 0}]}}} +score: 0.9125827550888062 + +24 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5560460090637207], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9036902189254761], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3706013560295105], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9046357870101929], 'step': 0}]}}} +score: 0.9046357870101929 + +25 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6939303874969482], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.6286612749099731], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6873336434364319], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.7205297946929932], 'step': 0}]}}} +score: 0.7205297946929932 + +26 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.43818390369415283], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9238788485527039], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.28707796335220337], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9119205474853516], 'step': 0}]}}} +score: 0.9119205474853516 + +27 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.5279895663261414], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.8571901321411133], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.3609880805015564], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8854304552078247], 'step': 0}]}}} +score: 0.8854304552078247 + +28 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4643488824367523], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.9394340515136719], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.31463563442230225], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.9139072895050049], 'step': 0}]}}} +score: 0.9139072895050049 + +29 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.4549124836921692], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.889293372631073], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.27763280272483826], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8933774828910828], 'step': 0}]}}} +score: 0.8933774828910828 + +30 model +metrics: {'metrics': {'loss': {'direction': 'min', 'observations': [{'value': [0.6735646724700928], 'step': 0}]}, 'accuracy': {'direction': 'max', 'observations': [{'value': [0.7860334515571594], 'step': 0}]}, 'val_loss': {'direction': 'min', 'observations': [{'value': [0.6475100517272949], 'step': 0}]}, 'val_accuracy': {'direction': 'max', 'observations': [{'value': [0.8072847723960876], 'step': 0}]}}} +score: 0.8072847723960876 + diff --git a/tasks/artembielov_task4/artembielov_face_recognition.py b/tasks/artembielov_task4/artembielov_face_recognition.py new file mode 100644 index 0000000..84c0298 --- /dev/null +++ b/tasks/artembielov_task4/artembielov_face_recognition.py @@ -0,0 +1,79 @@ +import tensorflow_hub as hub +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + + +model_name = 'model_v3.h5' +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 224 +img_width = 224 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + +class_names = ds_train.class_names + +feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" +feature_extractor_layer = hub.KerasLayer( + feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + feature_extractor_layer, + tf.keras.layers.Dense(num_classes), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, epochs=10, validation_data=ds_val) + +model.save('models/' + model_name) From 82077888b14ffc3b7019898814137dd5651da65a Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:53:10 +0200 Subject: [PATCH 12/21] Delete artembielov_mask.py --- tasks/artembielov_task2/artembielov_mask.py | 94 --------------------- 1 file changed, 94 deletions(-) delete mode 100644 tasks/artembielov_task2/artembielov_mask.py diff --git a/tasks/artembielov_task2/artembielov_mask.py b/tasks/artembielov_task2/artembielov_mask.py deleted file mode 100644 index 2bbc09c..0000000 --- a/tasks/artembielov_task2/artembielov_mask.py +++ /dev/null @@ -1,94 +0,0 @@ -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 180 -img_width = 180 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', - batch_size=batch_size, - image_size=(img_height,img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred',color_mode='rgb', - batch_size=batch_size, - image_size=(img_height,img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - - -def normalize(image, label): - image = tf.cast(image/255., tf.float32) - return image, label - - -class_names = ds_train.class_names -ds_train = ds_train.map(normalize) -ds_val = ds_val.map(normalize) - -AUTOTUNE = tf.data.AUTOTUNE - -ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) -ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), - layers.Conv2D(16, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(32, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(64, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Flatten(), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait = True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, - epochs=10, - validation_data=ds_val, - callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, - epochs=10, - validation_data=ds_val) From 88927d970c417cd7e30170afe49c06324730706b Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:53:35 +0200 Subject: [PATCH 13/21] Add files via upload --- tasks/artembielov_task2/artembielov_mask.py | 94 +++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tasks/artembielov_task2/artembielov_mask.py diff --git a/tasks/artembielov_task2/artembielov_mask.py b/tasks/artembielov_task2/artembielov_mask.py new file mode 100644 index 0000000..2cb3cac --- /dev/null +++ b/tasks/artembielov_task2/artembielov_mask.py @@ -0,0 +1,94 @@ +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 180 +img_width = 180 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + + +def normalize(image, label): + image = tf.cast(image / 255., tf.float32) + return image, label + + +class_names = ds_train.class_names +ds_train = ds_train.map(normalize) +ds_val = ds_val.map(normalize) + +AUTOTUNE = tf.data.AUTOTUNE + +ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, + epochs=10, + validation_data=ds_val, + callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, + epochs=10, + validation_data=ds_val) From c01a2feabf876604f25cb15c0c5e2f9f9a6d51e3 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:54:49 +0200 Subject: [PATCH 14/21] Delete artembielov_mask.py --- tasks/artembielov_task2/artembielov_mask.py | 94 --------------------- 1 file changed, 94 deletions(-) delete mode 100644 tasks/artembielov_task2/artembielov_mask.py diff --git a/tasks/artembielov_task2/artembielov_mask.py b/tasks/artembielov_task2/artembielov_mask.py deleted file mode 100644 index 2cb3cac..0000000 --- a/tasks/artembielov_task2/artembielov_mask.py +++ /dev/null @@ -1,94 +0,0 @@ -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 180 -img_width = 180 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path,labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - - -def normalize(image, label): - image = tf.cast(image / 255., tf.float32) - return image, label - - -class_names = ds_train.class_names -ds_train = ds_train.map(normalize) -ds_val = ds_val.map(normalize) - -AUTOTUNE = tf.data.AUTOTUNE - -ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) -ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), - layers.Conv2D(16, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(32, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Conv2D(64, 3, padding='same', activation=activation_function), - layers.MaxPooling2D(), - layers.Flatten(), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait=True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, - epochs=10, - validation_data=ds_val, - callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, - epochs=10, - validation_data=ds_val) From 950f6b6eee4c56ca5bcf671d73924eaf67d7034f Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:55:05 +0200 Subject: [PATCH 15/21] Add files via upload --- tasks/artembielov_task2/artembielov_mask.py | 94 +++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tasks/artembielov_task2/artembielov_mask.py diff --git a/tasks/artembielov_task2/artembielov_mask.py b/tasks/artembielov_task2/artembielov_mask.py new file mode 100644 index 0000000..0e1c858 --- /dev/null +++ b/tasks/artembielov_task2/artembielov_mask.py @@ -0,0 +1,94 @@ +import tensorflow as tf +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +from tensorflow import keras +import kerastuner as kt + +import IPython + +path = "..." + +activation_function = 'relu' +batch_size = 128 +img_height = 180 +img_width = 180 + +ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, seed=123, + validation_split=0.2, + subset='training') + +ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', + batch_size=batch_size, + image_size=(img_height, img_width), + shuffle=True, + seed=123, + validation_split=0.2, + subset='validation') + + +def normalize(image, label): + image = tf.cast(image / 255., tf.float32) + return image, label + + +class_names = ds_train.class_names +ds_train = ds_train.map(normalize) +ds_val = ds_val.map(normalize) + +AUTOTUNE = tf.data.AUTOTUNE + +ds_train = ds_train.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +ds_val = ds_val.cache().prefetch(buffer_size=AUTOTUNE) + + +def model_create(hp): + hp_units = hp.Int('units', min_value=32, max_value=512, step=32) + num_classes = len(class_names) + model = Sequential([ + layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation=activation_function), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(units=hp_units, activation=activation_function), + layers.Dense(num_classes) + ]) + + hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) + + model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + + return model + + +class ClearTrainingOutput(tf.keras.callbacks.Callback): + def on_train_end(*args, **kwargs): + IPython.display.clear_output(wait=True) + + +tuner = kt.Hyperband(model_create, + objective='val_accuracy', + max_epochs=10, + factor=3, + directory='my_dir', + project_name='intro_to_kt') + +tuner.search(ds_train, + epochs=10, + validation_data=ds_val, + callbacks=[ClearTrainingOutput()]) + +best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] + +model = tuner.hypermodel.build(best_hps) +model.fit(ds_train, + epochs=10, + validation_data=ds_val) From 5758005118b0ca1ada292bf6093c15cc1e902c1b Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 16:22:00 +0200 Subject: [PATCH 16/21] Delete artembielov_face_recognition.py --- .../artembielov_face_recognition.py | 79 ------------------- 1 file changed, 79 deletions(-) delete mode 100644 tasks/artembielov_task4/artembielov_face_recognition.py diff --git a/tasks/artembielov_task4/artembielov_face_recognition.py b/tasks/artembielov_task4/artembielov_face_recognition.py deleted file mode 100644 index 84c0298..0000000 --- a/tasks/artembielov_task4/artembielov_face_recognition.py +++ /dev/null @@ -1,79 +0,0 @@ -import tensorflow_hub as hub -import tensorflow as tf -from tensorflow.keras import layers -from tensorflow.keras.models import Sequential -from tensorflow import keras -import kerastuner as kt - -import IPython - - -model_name = 'model_v3.h5' -path = "..." - -activation_function = 'relu' -batch_size = 128 -img_height = 224 -img_width = 224 - -ds_train = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, seed=123, - validation_split=0.2, - subset='training') - -ds_val = tf.keras.preprocessing.image_dataset_from_directory(path, labels='inferred', color_mode='rgb', - batch_size=batch_size, - image_size=(img_height, img_width), - shuffle=True, - seed=123, - validation_split=0.2, - subset='validation') - -class_names = ds_train.class_names - -feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" -feature_extractor_layer = hub.KerasLayer( - feature_extractor_model, input_shape=(img_height, img_width, 3), trainable=False) - - -def model_create(hp): - hp_units = hp.Int('units', min_value=32, max_value=512, step=32) - num_classes = len(class_names) - model = Sequential([ - feature_extractor_layer, - tf.keras.layers.Dense(num_classes), - layers.Dense(units=hp_units, activation=activation_function), - layers.Dense(num_classes) - ]) - - hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) - - model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), - metrics=['accuracy']) - - return model - - -class ClearTrainingOutput(tf.keras.callbacks.Callback): - def on_train_end(*args, **kwargs): - IPython.display.clear_output(wait=True) - - -tuner = kt.Hyperband(model_create, - objective='val_accuracy', - max_epochs=10, - factor=3, - directory='my_dir', - project_name='intro_to_kt') - -tuner.search(ds_train, epochs=10, validation_data=ds_val, callbacks=[ClearTrainingOutput()]) - -best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] - -model = tuner.hypermodel.build(best_hps) -model.fit(ds_train, epochs=10, validation_data=ds_val) - -model.save('models/' + model_name) From 04f29832a1a11d811512f7c06258442ff0adc745 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 16:23:12 +0200 Subject: [PATCH 17/21] Add files via upload --- .../artembielov_face_recognition.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tasks/artembielov_task4/artembielov_face_recognition.py diff --git a/tasks/artembielov_task4/artembielov_face_recognition.py b/tasks/artembielov_task4/artembielov_face_recognition.py new file mode 100644 index 0000000..128290c --- /dev/null +++ b/tasks/artembielov_task4/artembielov_face_recognition.py @@ -0,0 +1,46 @@ +from facenet_pytorch import MTCNN, InceptionResnetV1 +import torch +from torch.utils.data import DataLoader +from torchvision import datasets +import os +import matplotlib.pyplot as plt + +workers = 0 if os.name == 'nt' else 4 + +device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') +print('Running on device: {}'.format(device)) + +mtcnn = MTCNN( + image_size=160, margin=20, min_face_size=20, + thresholds=[0.6, 0.7, 0.7], factor=0.709, post_process=True, + device=device +) + +resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device) + + +def collate_fn(x): + return x[0] + + +dataset = datasets.ImageFolder('D:/projects/Python/Mask/recognition/test_images') +dataset.idx_to_class = {i: c for c, i in dataset.class_to_idx.items()} +loader = DataLoader(dataset, collate_fn=collate_fn, num_workers=workers) + +aligned = [] +for x, y in loader: + x_aligned = mtcnn(x) + plt.imshow(x_aligned.permute(1, 2, 0)) + plt.show() + if x_aligned is not None: + aligned.append(x_aligned) + +aligned = torch.stack(aligned).to(device) +embeddings = resnet(aligned).detach().cpu() +threshold = 0.55 +for e1 in embeddings: + dists = [(e1 - e2).norm().item() for e2 in embeddings] +if dists[0] < threshold: + print('Person on photos is the same person!') +else: + print('Person on photos is not the same person!') From 452aadb635f05cfdbaf702ea3d70af90f3107018 Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 16:23:31 +0200 Subject: [PATCH 18/21] Add files via upload From 9fc124e1df7a5d64b7ca58439f102adb14318b6c Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 18:23:41 +0200 Subject: [PATCH 19/21] Update artembielov_face_recognition.py --- tasks/artembielov_task4/artembielov_face_recognition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/artembielov_task4/artembielov_face_recognition.py b/tasks/artembielov_task4/artembielov_face_recognition.py index 128290c..5137543 100644 --- a/tasks/artembielov_task4/artembielov_face_recognition.py +++ b/tasks/artembielov_task4/artembielov_face_recognition.py @@ -23,7 +23,7 @@ def collate_fn(x): return x[0] -dataset = datasets.ImageFolder('D:/projects/Python/Mask/recognition/test_images') +dataset = datasets.ImageFolder('...') dataset.idx_to_class = {i: c for c, i in dataset.class_to_idx.items()} loader = DataLoader(dataset, collate_fn=collate_fn, num_workers=workers) From 3a407c8e08e0ad22598b10b8dbf3a7c39082272a Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 18:24:41 +0200 Subject: [PATCH 20/21] Update artembielov_house_price.py --- tasks/artembielov_task1/House price/artembielov_house_price.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/artembielov_task1/House price/artembielov_house_price.py b/tasks/artembielov_task1/House price/artembielov_house_price.py index 4cfeb1a..25d2e6f 100644 --- a/tasks/artembielov_task1/House price/artembielov_house_price.py +++ b/tasks/artembielov_task1/House price/artembielov_house_price.py @@ -8,7 +8,7 @@ from mlxtend.regressor import StackingRegressor -path = 'D:/projects/Python/Samsung2/House price/data/' +path = '...' test = pd.read_csv(path + 'test.csv') train = pd.read_csv(path + 'train.csv') From 8a51dd499d672b95ea3768b6cb58282e54fa489c Mon Sep 17 00:00:00 2001 From: blinddegimon <44979128+blinddegimon@users.noreply.github.com> Date: Tue, 9 Feb 2021 18:29:45 +0200 Subject: [PATCH 21/21] Update artembielov_titanic.py --- tasks/artembielov_task1/Titanic/artembielov_titanic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/artembielov_task1/Titanic/artembielov_titanic.py b/tasks/artembielov_task1/Titanic/artembielov_titanic.py index bfd0f87..443aab2 100644 --- a/tasks/artembielov_task1/Titanic/artembielov_titanic.py +++ b/tasks/artembielov_task1/Titanic/artembielov_titanic.py @@ -2,7 +2,7 @@ from sklearn.ensemble import RandomForestClassifier -path = 'D:/projects/Python/Samsung2/Titanic/data/' +path = '...' train_data = pd.read_csv(path + "train.csv") test_data = pd.read_csv(path + "test.csv")