Repository: MLEveryday/100-Days-Of-ML-Code Branch: master Commit: 04e7076df2c8 Files: 45 Total size: 11.5 MB Directory structure: gitextract_grz_jkps/ ├── .gitignore ├── Code/ │ ├── Day 11_K-NN.ipynb │ ├── Day 11_K-NN.md │ ├── Day 11_k-NN.py │ ├── Day 13_SVM.ipynb │ ├── Day 13_SVM.md │ ├── Day 13_SVM.py │ ├── Day 1_Data_Preprocessing.ipynb │ ├── Day 1_Data_Preprocessing.md │ ├── Day 1_Data_Preprocessing.py │ ├── Day 25_Decision_Tree.ipynb │ ├── Day 25_Decision_Tree.md │ ├── Day 25_Decision_Tree.py │ ├── Day 2_Simple_Linear_Regression.ipynb │ ├── Day 2_Simple_Linear_Regression.md │ ├── Day 2_Simple_Linear_Regression.py │ ├── Day 34_Random_Forests.ipynb │ ├── Day 34_Random_Forests.md │ ├── Day 34_Random_Forests.py │ ├── Day 39.ipynb │ ├── Day 3_Multiple_Linear_Regression.ipynb │ ├── Day 3_Multiple_Linear_Regression.md │ ├── Day 3_Multiple_Linear_Regression.py │ ├── Day 40.ipynb │ ├── Day 41.ipynb │ ├── Day 42.ipynb │ ├── Day 6_Logistic_Regression.ipynb │ ├── Day 6_Logistic_Regression.md │ ├── Day 6_Logistic_Regression.py │ ├── KafkaProducer.py │ ├── TestKafka.py │ └── my/ │ ├── Data_age_salary.csv │ └── LinerTest.py ├── FAQ.MD ├── LICENSE ├── Other Docs/ │ ├── README.md │ └── 速查手册/ │ └── README.md ├── README.md ├── Translation specification.MD └── datasets/ ├── 50_Startups.csv ├── Data.csv ├── Social_Network_Ads.csv ├── mnist.npz ├── readme.md └── studentscores.csv ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ /.idea /datasets/*.bak ================================================ FILE: Code/Day 11_K-NN.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#机器学习100天——第十一天:K近邻法(K-NN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第一步:导入相关库" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第二步:导入数据集" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " User ID Gender Age EstimatedSalary Purchased\n", "0 15624510 Male 19 19000 0\n", "1 15810944 Male 35 20000 0\n", "2 15668575 Female 26 43000 0\n", "3 15603246 Female 27 57000 0\n", "4 15804002 Male 19 76000 0\n", "5 15728773 Male 27 58000 0\n", "6 15598044 Female 27 84000 0\n", "7 15694829 Female 32 150000 1\n", "8 15600575 Male 25 33000 0\n", "9 15727311 Female 35 65000 0\n", "10 15570769 Female 26 80000 0\n", "11 15606274 Female 26 52000 0\n", "12 15746139 Male 20 86000 0\n", "13 15704987 Male 32 18000 0\n", "14 15628972 Male 18 82000 0\n", "15 15697686 Male 29 80000 0\n", "16 15733883 Male 47 25000 1\n", "17 15617482 Male 45 26000 1\n", "18 15704583 Male 46 28000 1\n", "19 15621083 Female 48 29000 1\n", "20 15649487 Male 45 22000 1\n", "21 15736760 Female 47 49000 1\n", "22 15714658 Male 48 41000 1\n", "23 15599081 Female 45 22000 1\n", "24 15705113 Male 46 23000 1\n", "25 15631159 Male 47 20000 1\n", "26 15792818 Male 49 28000 1\n", "27 15633531 Female 47 30000 1\n", "28 15744529 Male 29 43000 0\n", "29 15669656 Male 31 18000 0\n", ".. ... ... ... ... ...\n", "370 15611430 Female 60 46000 1\n", "371 15774744 Male 60 83000 1\n", "372 15629885 Female 39 73000 0\n", "373 15708791 Male 59 130000 1\n", "374 15793890 Female 37 80000 0\n", "375 15646091 Female 46 32000 1\n", "376 15596984 Female 46 74000 0\n", "377 15800215 Female 42 53000 0\n", "378 15577806 Male 41 87000 1\n", "379 15749381 Female 58 23000 1\n", "380 15683758 Male 42 64000 0\n", "381 15670615 Male 48 33000 1\n", "382 15715622 Female 44 139000 1\n", "383 15707634 Male 49 28000 1\n", "384 15806901 Female 57 33000 1\n", "385 15775335 Male 56 60000 1\n", "386 15724150 Female 49 39000 1\n", "387 15627220 Male 39 71000 0\n", "388 15672330 Male 47 34000 1\n", "389 15668521 Female 48 35000 1\n", "390 15807837 Male 48 33000 1\n", "391 15592570 Male 47 23000 1\n", "392 15748589 Female 45 45000 1\n", "393 15635893 Male 60 42000 1\n", "394 15757632 Female 39 59000 0\n", "395 15691863 Female 46 41000 1\n", "396 15706071 Male 51 23000 1\n", "397 15654296 Female 50 20000 1\n", "398 15755018 Male 36 33000 0\n", "399 15594041 Female 49 36000 1\n", "\n", "[400 rows x 5 columns]\n" ] } ], "source": [ "dataset = pd.read_csv('../datasets/Social_Network_Ads.csv')\n", "print(dataset)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "为了方便理解,这里我们只取Age年龄和EstimatedSalary估计工资作为特征" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "X = dataset.iloc[:, [2, 3]].values\n", "y = dataset.iloc[:, 4].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第三步:将数据划分成训练集和测试集" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第四步:特征缩放" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\anaconda\\lib\\site-packages\\sklearn\\utils\\validation.py:429: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", " warnings.warn(msg, _DataConversionWarning)\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "X_train = sc.fit_transform(X_train)\n", "X_test = sc.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "##第五步:使用K-NN对训练集数据进行训练" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从sklearn的neighbors类中导入KNeighborsClassifier学习器" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.neighbors import KNeighborsClassifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "设置好相关的参数\n", "n_neighbors = 5(K值的选择,默认选择5)、\n", "metric = 'minkowski'(距离度量的选择,这里选择的是闵氏距离(默认参数))、\n", "p = 2 (距离度量metric的附属参数,只用于闵氏距离和带权重闵氏距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。默认为2)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n", " weights='uniform')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第六步:对测试集进行预测" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0\n", " 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1\n", " 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 1 1 1]\n" ] } ], "source": [ "y_pred = classifier.predict(X_test)\n", "print(y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##第七步:生成混淆矩阵" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "混淆矩阵可以对一个分类器性能进行分析,由此可以计算出许多指标,例如:ROC曲线、正确率等" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[64 4]\n", " [ 3 29]]\n" ] } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "cm = confusion_matrix(y_test, y_pred)\n", "print(cm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " 预测值\n", " 0 1\n", " 实0 64 4 \n", " 际1 3 29\n", " 值\n", "\n", "预测集中的0总共有68个,1总共有32个。\n", "在这个混淆矩阵中,实际有68个0,但K-NN预测出有67(64+3)个0,其中有3个实际上是1。\n", "同时K-NN预测出有33(4+29)个1,其中4个实际上是0。" ] } ], "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 11_K-NN.md ================================================ # K近邻法 (K-NN)

## 数据集 | 社交网络

## 导入相关库 ```python import numpy as np import matplotlib.pyplot as plt import pandas as pd ``` ## 导入数据集 ```python dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values ``` ## 将数据划分成训练集和测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) ``` ## 特征缩放 ```python from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` ## 使用K-NN对训练集数据进行训练 ```python from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2) classifier.fit(X_train, y_train) ``` ## 对测试集进行预测 ```python y_pred = classifier.predict(X_test) ``` ## 生成混淆矩阵 ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) ``` ================================================ FILE: Code/Day 11_k-NN.py ================================================ # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Fitting K-NN to the Training set from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2) classifier.fit(X_train, y_train) # Predicting the Test set results y_pred = classifier.predict(X_test) # Making the Confusion Matrix from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report cm = confusion_matrix(y_test, y_pred) print(cm) print(classification_report(y_test, y_pred)) ================================================ FILE: Code/Day 13_SVM.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第13天:支持向量机 (SVM)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第一步:导入库" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第二步:导入数据" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dataset = pd.read_csv('../datasets/Social_Network_Ads.csv')\n", "X = dataset.iloc[:, [2, 3]].values\n", "y = dataset.iloc[:, 4].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第三步:拆分数据集为训练集合和测试集合" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第四步:特征量化" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "X_train = sc.fit_transform(X_train)\n", "X_test = sc.fit_transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第五步:适配SVM到训练集合" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n", " decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',\n", " max_iter=-1, probability=False, random_state=0, shrinking=True,\n", " tol=0.001, verbose=False)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.svm import SVC\n", "classifier = SVC(kernel = 'linear', random_state = 0)\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第六步:预测测试集合结果" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y_pred = classifier.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第七步:创建混淆矩阵" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "cm = confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第八步:训练集合结果可视化" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_train, y_train\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('SVM (Training set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第九步:测试集合结果可视化" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n1pPjhAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_test, y_test\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('SVM (Test set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "完整的项目请前往Github项目100-Days-Of-ML-Code查看。有任何的建议或者意见欢迎在issue中提出~" ] } ], "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 13_SVM.md ================================================ # Day 13 | 支持向量机 (SVM)

## 导入库 ```python import numpy as np import matplotlib.pyplot as plt import pandas as pd ``` ## 导入数据 ```python dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values ``` ## 拆分数据集为训练集合和测试集合 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) ``` ## 特征量化 ```python from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.fit_transform(X_test) ``` ## 适配SVM到训练集合 ```python from sklearn.svm import SVC classifier = SVC(kernel = 'linear', random_state = 0) classifier.fit(X_train, y_train) ``` ## 预测测试集合结果 ```python y_pred = classifier.predict(X_test) ``` ## 创建混淆矩阵 ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) ``` ## 训练集合结果可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('SVM (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ```

## 测试集合结果可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('SVM (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ```

================================================ FILE: Code/Day 13_SVM.py ================================================ #Day13: Support Vector Machine (SVM) #Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd #Importing the dataset dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values #Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) #Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) #Fitting SVM to the Training set from sklearn.svm import SVC classifier = SVC(kernel = 'linear', random_state = 0) classifier.fit(X_train, y_train) #Predicting the Test set results y_pred = classifier.predict(X_test) #Making the Confusion Matrix from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report cm = confusion_matrix(y_test, y_pred) print(cm) print(classification_report(y_test, y_pred)) #Visualising the Training set results from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('SVM (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() #Visualising the Test set results from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('SVM (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ================================================ FILE: Code/Day 1_Data_Preprocessing.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第1天:数据预处理(Data Preprocessing)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "搭建anaconda环境,参考 https://zhuanlan.zhihu.com/p/33358809\n", "\n", "## 第一步:导入需要的库\n", "这两个是我们每次都需要导入的库。NumPy包含数学计算函数。Pandas用于导入和管理数据集。" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[ 7. 2. 3. ]\n [ 4. 3.5 6. ]\n [10. 3.5 9. ]]\nSklearn verion is 0.23.1\n" ] } ], "source": [ "import sklearn\n", "from sklearn.impute import SimpleImputer\n", "#This block is an example used to learn SimpleImputer\n", "imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')\n", "imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])\n", "X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]\n", "print(imp_mean.transform(X))\n", "print(\"Sklearn verion is {}\".format(sklearn.__version__))" ] }, { "source": [ "from sklearn.preprocessing import OneHotEncoder\n", "enc = OneHotEncoder(handle_unknown='ignore')\n", "X = [['Male', 1], ['Female', 3], ['Female', 2]]\n", ">>> enc.fit(X)\n", "OneHotEncoder(handle_unknown='ignore')\n", ">>> enc.categories_\n", "[array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]\n", ">>> enc.transform([['Female', 1], ['Male', 4]]).toarray()\n", "array([[1., 0., 1., 0., 0.],\n", " [0., 1., 0., 0., 0.]])\n", ">>> enc.inverse_transform([[0, 1, 1, 0, 0], [0, 0, 0, 1, 0]])\n", "array([['Male', 1],\n", " [None, 2]], dtype=object)\n", ">>> enc.get_feature_names(['gender', 'group'])\n", "array(['gender_Female', 'gender_Male', 'group_1', 'group_2', 'group_3'],\n", " dtype=object)" ], "cell_type": "code", "metadata": {}, "execution_count": 4, "outputs": [ { "output_type": "error", "ename": "SyntaxError", "evalue": "invalid syntax (, line 4)", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m >>> enc.fit(X)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" ] } ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第二步:导入数据集\n", "数据集通常是.csv格式。CSV文件以文本形式保存表格数据。文件的每一行是一条数据记录。我们使用Pandas的read_csv方法读取本地csv文件为一个数据帧。然后,从数据帧中制作自变量和因变量的矩阵和向量。" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Step 2: Importing dataset\nX\n[['France' 44.0 72000.0]\n ['Spain' 27.0 48000.0]\n ['Germany' 30.0 54000.0]\n ['Spain' 38.0 61000.0]\n ['Germany' 40.0 nan]\n ['France' 35.0 58000.0]\n ['Spain' nan 52000.0]\n ['France' 48.0 79000.0]\n ['Germany' 50.0 83000.0]\n ['France' 37.0 67000.0]]\nY\n['No' 'Yes' 'No' 'No' 'Yes' 'Yes' 'No' 'Yes' 'No' 'Yes']\n[[44.0 72000.0]\n [27.0 48000.0]\n [30.0 54000.0]\n [38.0 61000.0]\n [40.0 nan]\n [35.0 58000.0]\n [nan 52000.0]\n [48.0 79000.0]\n [50.0 83000.0]\n [37.0 67000.0]]\n" ] } ], "source": [ "dataset = pd.read_csv('../datasets/Data.csv')\n", "# 不包括最后一列的所有列\n", "X = dataset.iloc[ : , :-1].values\n", "#取最后一列\n", "Y = dataset.iloc[ : , 3].values\n", "print(\"Step 2: Importing dataset\")\n", "print(\"X\")\n", "print(X)\n", "print(\"Y\")\n", "print(Y)\n", "print(X[ : , 1:3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第三步:处理丢失数据\n", "我们得到的数据很少是完整的。数据可能因为各种原因丢失,为了不降低机器学习模型的性能,需要处理数据。我们可以用整列的平均值或中间值替换丢失的数据。我们用sklearn.preprocessing库中的Imputer类完成这项任务。" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "---------------------\nStep 3: Handling the missing data\nstep2\nX\n[['France' 44.0 72000.0]\n ['Spain' 27.0 48000.0]\n ['Germany' 30.0 54000.0]\n ['Spain' 38.0 61000.0]\n ['Germany' 40.0 63777.77777777778]\n ['France' 35.0 58000.0]\n ['Spain' 38.77777777777778 52000.0]\n ['France' 48.0 79000.0]\n ['Germany' 50.0 83000.0]\n ['France' 37.0 67000.0]]\n" ] } ], "source": [ "# If you use the newest version of sklearn, use the lines of code commented out\n", "from sklearn.impute import SimpleImputer\n", "imputer = SimpleImputer(missing_values=np.nan, strategy=\"mean\")\n", "#from sklearn.preprocessing import Imputer\n", "# axis=0表示按列进行\n", "#imputer = Imputer(missing_values = \"NaN\", strategy = \"mean\", axis = 0)\n", "#print(imputer)\n", "#\n", "# print(X[ : , 1:3])\n", "imputer = imputer.fit(X[ : , 1:3]) #put the data we want to process in to this imputer\n", "X[ : , 1:3] = imputer.transform(X[ : , 1:3]) #replace the np.nan with mean\n", "#print(X[ : , 1:3])\n", "print(\"---------------------\")\n", "print(\"Step 3: Handling the missing data\")\n", "print(\"step2\")\n", "print(\"X\")\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第四步:解析分类数据\n", "分类数据指的是含有标签值而不是数字值的变量。取值范围通常是固定的。例如\"Yes\"和\"No\"不能用于模型的数学计算,所以需要解析成数字。为实现这一功能,我们从sklearn.preprocessing库导入LabelEncoder类。" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "---------------------\nStep 4: Encoding categorical data\nX\n[[1.0 0.0 0.0 44.0 72000.0]\n [0.0 0.0 1.0 27.0 48000.0]\n [0.0 1.0 0.0 30.0 54000.0]\n [0.0 0.0 1.0 38.0 61000.0]\n [0.0 1.0 0.0 40.0 63777.77777777778]\n [1.0 0.0 0.0 35.0 58000.0]\n [0.0 0.0 1.0 38.77777777777778 52000.0]\n [1.0 0.0 0.0 48.0 79000.0]\n [0.0 1.0 0.0 50.0 83000.0]\n [1.0 0.0 0.0 37.0 67000.0]]\nY\n[0 1 0 0 1 1 0 1 0 1]\n" ] } ], "source": [ "from sklearn.preprocessing import LabelEncoder, OneHotEncoder\n", "from sklearn.compose import ColumnTransformer \n", "#labelencoder_X = LabelEncoder()\n", "#X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])\n", "#Creating a dummy variable\n", "#print(X)\n", "ct = ColumnTransformer([(\"\", OneHotEncoder(), [0])], remainder = 'passthrough')\n", "X = ct.fit_transform(X)\n", "#onehotencoder = OneHotEncoder(categorical_features = [0])\n", "#X = onehotencoder.fit_transform(X).toarray()\n", "labelencoder_Y = LabelEncoder()\n", "Y = labelencoder_Y.fit_transform(Y)\n", "print(\"---------------------\")\n", "print(\"Step 4: Encoding categorical data\")\n", "print(\"X\")\n", "print(X)\n", "print(\"Y\")\n", "print(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第五步:拆分数据集为测试集合和训练集合\n", "把数据集拆分成两个:一个是用来训练模型的训练集合,另一个是用来验证模型的测试集合。两者比例一般是80:20。我们导入sklearn.model_selection库中的train_test_split()方法。" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "---------------------\nStep 5: Splitting the datasets into training sets and Test sets\nX_train\n[[0.0 1.0 0.0 40.0 63777.77777777778]\n [1.0 0.0 0.0 37.0 67000.0]\n [0.0 0.0 1.0 27.0 48000.0]\n [0.0 0.0 1.0 38.77777777777778 52000.0]\n [1.0 0.0 0.0 48.0 79000.0]\n [0.0 0.0 1.0 38.0 61000.0]\n [1.0 0.0 0.0 44.0 72000.0]\n [1.0 0.0 0.0 35.0 58000.0]]\nX_test\n[[0.0 1.0 0.0 30.0 54000.0]\n [0.0 1.0 0.0 50.0 83000.0]]\nY_train\n[1 1 1 0 1 0 0 1]\nY_test\n[0 0]\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)\n", "print(\"---------------------\")\n", "print(\"Step 5: Splitting the datasets into training sets and Test sets\")\n", "print(\"X_train\")\n", "print(X_train)\n", "print(\"X_test\")\n", "print(X_test)\n", "print(\"Y_train\")\n", "print(Y_train)\n", "print(\"Y_test\")\n", "print(Y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第六步:特征量化\n", "大部分模型算法使用两点间的欧氏距离表示,但此特征在幅度、单位和范围姿态问题上变化很大。在距离计算中,高幅度的特征比低幅度特征权重更大。可用特征标准化或Z值归一化解决。导入sklearn.preprocessing库的StandardScalar类。" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "---------------------\nStep 6: Feature Scaling\nX_train\n[[-1. 2.64575131 -0.77459667 0.26306757 0.12381479]\n [ 1. -0.37796447 -0.77459667 -0.25350148 0.46175632]\n [-1. -0.37796447 1.29099445 -1.97539832 -1.53093341]\n [-1. -0.37796447 1.29099445 0.05261351 -1.11141978]\n [ 1. -0.37796447 -0.77459667 1.64058505 1.7202972 ]\n [-1. -0.37796447 1.29099445 -0.0813118 -0.16751412]\n [ 1. -0.37796447 -0.77459667 0.95182631 0.98614835]\n [ 1. -0.37796447 -0.77459667 -0.59788085 -0.48214934]]\nX_test\n[[-1. 2.64575131 -0.77459667 -1.45882927 -0.90166297]\n [-1. 2.64575131 -0.77459667 1.98496442 2.13981082]]\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc_X = StandardScaler()\n", "X_train = sc_X.fit_transform(X_train)\n", "X_test = sc_X.transform(X_test) #we should not use fit_transfer cause the u and z is determined from x_train\n", "print(\"---------------------\")\n", "print(\"Step 6: Feature Scaling\")\n", "print(\"X_train\")\n", "print(X_train)\n", "print(\"X_test\")\n", "print(X_test)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "完整的项目请前往Github项目100-Days-Of-ML-Code查看。有任何的建议或者意见欢迎在issue中提出~" ] } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3.8.3 64-bit (conda)", "metadata": { "interpreter": { "hash": "1b78ff499ec469310b6a6795c4effbbfc85eb20a6ba0cf828a15721670711b2c" } } }, "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.8.3-final" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 1_Data_Preprocessing.md ================================================ # 数据预处理

如图所示,通过6步完成数据预处理。 此例用到的[数据](https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/datasets/Data.csv),[代码](https://github.com/MLEveryday/100-Days-Of-ML-Code/blob/master/Code/Day%201_Data_Preprocessing.py)。 ## 第1步:导入库 ```Python import numpy as np import pandas as pd ``` ## 第2步:导入数据集 ```python //随后一列是label dataset = pd.read_csv('Data.csv')//读取csv文件 X = dataset.iloc[ : , :-1].values//.iloc[行,列] Y = dataset.iloc[ : , 3].values // : 全部行 or 列;[a]第a行 or 列 // [a,b,c]第 a,b,c 行 or 列 ``` ## 第3步:处理丢失数据 ```python from sklearn.preprocessing import Imputer imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0) imputer = imputer.fit(X[ : , 1:3]) X[ : , 1:3] = imputer.transform(X[ : , 1:3]) ``` ## 第4步:解析分类数据 ```python from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder_X = LabelEncoder() X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0]) ``` ### 创建虚拟变量 ```python onehotencoder = OneHotEncoder(categorical_features = [0]) X = onehotencoder.fit_transform(X).toarray() labelencoder_Y = LabelEncoder() Y = labelencoder_Y.fit_transform(Y) ``` ## 第5步:拆分数据集为训练集合和测试集合 ```python #from sklearn.model_selection import train_test_split from sklearn.cross_validation import train_test_split X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0) ``` ## 第6步:特征量化 ```python from sklearn.preprocessing import StandardScaler sc_X = StandardScaler() X_train = sc_X.fit_transform(X_train) X_test = sc_X.transform(X_test) ``` ================================================ FILE: Code/Day 1_Data_Preprocessing.py ================================================ #Day 1: Data Prepocessing #Step 1: Importing the libraries import numpy as np import pandas as pd #Step 2: Importing dataset dataset = pd.read_csv('../datasets/Data.csv') X = dataset.iloc[ : , :-1].values Y = dataset.iloc[ : , 3].values print("Step 2: Importing dataset") print("X") print(X) print("Y") print(Y) #Step 3: Handling the missing data # If you use the newest version of sklearn, use the lines of code commented out from sklearn.impute import SimpleImputer imputer = SimpleImputer(missing_values=np.nan, strategy="mean") #from sklearn.preprocessing import Imputer # axis=0表示按列进行 #imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0) imputer = imputer.fit(X[ : , 1:3]) X[ : , 1:3] = imputer.transform(X[ : , 1:3]) print("---------------------") print("Step 3: Handling the missing data") print("step2") print("X") print(X) #Step 4: Encoding categorical data from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.compose import ColumnTransformer #labelencoder_X = LabelEncoder() #X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0]) #Creating a dummy variable #print(X) ct = ColumnTransformer([("", OneHotEncoder(), [0])], remainder = 'passthrough') X = ct.fit_transform(X) #onehotencoder = OneHotEncoder(categorical_features = [0]) #X = onehotencoder.fit_transform(X).toarray() labelencoder_Y = LabelEncoder() Y = labelencoder_Y.fit_transform(Y) print("---------------------") print("Step 4: Encoding categorical data") print("X") print(X) print("Y") print(Y) #Step 5: Splitting the datasets into training sets and Test sets from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0) print("---------------------") print("Step 5: Splitting the datasets into training sets and Test sets") print("X_train") print(X_train) print("X_test") print(X_test) print("Y_train") print(Y_train) print("Y_test") print(Y_test) #Step 6: Feature Scaling from sklearn.preprocessing import StandardScaler sc_X = StandardScaler() X_train = sc_X.fit_transform(X_train) X_test = sc_X.transform(X_test) print("---------------------") print("Step 6: Feature Scaling") print("X_train") print(X_train) print("X_test") print(X_test) ================================================ FILE: Code/Day 25_Decision_Tree.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第25天:决策树(Decision Tree)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第1步:导入需要用到的python库" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第2步:导入数据集" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dataset = pd.read_csv('../datasets/Social_Network_Ads.csv')\n", "X = dataset.iloc[:, [2, 3]].values\n", "y = dataset.iloc[:, 4].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第3步:将数据集拆分为训练集和测试集" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第4步:特征缩放" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ymao/usr/miniconda/lib/python3.6/site-packages/sklearn/utils/validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", " warnings.warn(msg, DataConversionWarning)\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "X_train = sc.fit_transform(X_train)\n", "X_test = sc.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第5步:对测试集进行决策树分类拟合" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,\n", " max_features=None, max_leaf_nodes=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, presort=False, random_state=0,\n", " splitter='best')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0)\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第6步:预测测试集的结果" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y_pred = classifier.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第7步:制作混淆矩阵" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "cm = confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第8步:将训练集结果进行可视化" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nnsJsAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_train, y_train\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('Decision Tree Classification (Training set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第9步:将测试集结果进行可视化" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nifLpAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_test, y_test\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('Decision Tree Classification (Test set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "完整的项目请前往Github项目100-Days-Of-ML-Code查看。有任何的建议或者意见欢迎在issue中提出~" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 25_Decision_Tree.md ================================================ # 决策树分类

### 导入需要用到的python库 ```python import numpy as np import matplotlib.pyplot as plt import pandas as pd ``` ### 导入数据集 ```python dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values ``` ### 将数据集拆分为训练集和测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) ``` ### 特征缩放 ```python from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` ### 对测试集进行决策树分类拟合 ```python from sklearn.tree import DecisionTreeClassifier classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0) classifier.fit(X_train, y_train) ``` ### 预测测试集的结果 ```python y_pred = classifier.predict(X_test) ``` ### 制作混淆矩阵 ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) ``` ### 将训练集结果进行可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Decision Tree Classification (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ``` ### 将测试集结果进行可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Decision Tree Classification (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ``` ================================================ FILE: Code/Day 25_Decision_Tree.py ================================================ # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Fitting Decision Tree Classification to the Training set from sklearn.tree import DecisionTreeClassifier classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0) classifier.fit(X_train, y_train) # Predicting the Test set results y_pred = classifier.predict(X_test) # Making the Confusion Matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) # Visualising the Training set results from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Decision Tree Classification (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() # Visualising the Test set results from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Decision Tree Classification (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ================================================ FILE: Code/Day 2_Simple_Linear_Regression.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第二天:简单线性回归\n", "## 第一步:数据预处理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里导入我们需要的库,值得注意的是,这里比第一天多了一个matplotlib.pyplot,matplotlib是python上的一个2D绘图库,\n", "matplotlib下的模块pyplot是一个有命令样式的函数集合,\n", "matplotlib.pyplot是为我们对结果进行图像化作准备的。" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "导入相关数据" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " Hours Scores\n0 2.5 21\n1 5.1 47\n2 3.2 27\n3 8.5 75\n4 3.5 30\n5 1.5 20\n6 9.2 88\n7 5.5 60\n8 8.3 81\n9 2.7 25\n10 7.7 85\n11 5.9 62\n12 4.5 41\n13 3.3 42\n14 1.1 17\n15 8.9 95\n16 2.5 30\n17 1.9 24\n18 6.1 67\n19 7.4 69\n20 2.7 30\n21 4.8 54\n22 3.8 35\n23 6.9 76\n24 7.8 86\n25 2.1 93\n26 2.2 93\n27 2.5 93\n Hours Scores\n15 8.9 95\n27 2.5 93\n26 2.2 93\n25 2.1 93\n6 9.2 88\n24 7.8 86\n10 7.7 85\n8 8.3 81\n23 6.9 76\n3 8.5 75\n19 7.4 69\n18 6.1 67\n11 5.9 62\n7 5.5 60\n21 4.8 54\n1 5.1 47\n13 3.3 42\n12 4.5 41\n22 3.8 35\n20 2.7 30\n4 3.5 30\n16 2.5 30\n2 3.2 27\n9 2.7 25\n17 1.9 24\n0 2.5 21\n5 1.5 20\n14 1.1 17\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ " Hours Scores\n", "0 2.5 21\n", "1 5.1 47\n", "2 3.2 27\n", "3 8.5 75\n", "4 3.5 30\n", "5 1.5 20\n", "6 9.2 88\n", "7 5.5 60\n", "8 8.3 81\n", "9 2.7 25\n", "10 7.7 85\n", "11 5.9 62\n", "12 4.5 41\n", "13 3.3 42\n", "14 1.1 17\n", "15 8.9 95\n", "16 2.5 30\n", "17 1.9 24\n", "18 6.1 67\n", "19 7.4 69\n", "20 2.7 30\n", "21 4.8 54\n", "22 3.8 35\n", "23 6.9 76\n", "24 7.8 86\n", "25 2.1 93\n", "26 2.2 93\n", "27 2.5 93" ], "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
HoursScores
02.521
15.147
23.227
38.575
43.530
51.520
69.288
75.560
88.381
92.725
107.785
115.962
124.541
133.342
141.117
158.995
162.530
171.924
186.167
197.469
202.730
214.854
223.835
236.976
247.886
252.193
262.293
272.593
\n
" }, "metadata": {}, "execution_count": 90 } ], "source": [ "dataset = pd.read_csv('../datasets/studentscores.csv')\n", "print(dataset)\n", "df = dataset.sort_values(\"Scores\",ascending=False)\n", "print(df)\n", "dataset.head(30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里我们需要使用pandas的iloc(区分于loc根据index来索引,iloc利用行号来索引)方法来对数据进行处理,第一个参数为行号,:表示全部行,第二个参数 :1表示截到第1列(也就是取第0列)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "X: [[2.5]\n [5.1]\n [3.2]\n [8.5]\n [3.5]\n [1.5]\n [9.2]\n [5.5]\n [8.3]\n [2.7]\n [7.7]\n [5.9]\n [4.5]\n [3.3]\n [1.1]\n [8.9]\n [2.5]\n [1.9]\n [6.1]\n [7.4]\n [2.7]\n [4.8]\n [3.8]\n [6.9]\n [7.8]]\nY: [[21]\n [47]\n [27]\n [75]\n [30]\n [20]\n [88]\n [60]\n [81]\n [25]\n [85]\n [62]\n [41]\n [42]\n [17]\n [95]\n [30]\n [24]\n [67]\n [69]\n [30]\n [54]\n [35]\n [76]\n [86]]\n" ] } ], "source": [ "X = dataset.iloc[ 0: 25, : 1 ].values\n", "Y = dataset.iloc[ 0: 25, -1: ].values\n", "print(\"X:\",X)\n", "print(\"Y:\",Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "导入sklearn库的cross_validation类来对数据进行训练集、测试集划分" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[7.8]\n [6.9]\n [1.1]\n [5.1]\n [7.7]\n [3.3]\n [8.3]\n [9.2]\n [6.1]\n [3.5]\n [2.7]\n [5.5]\n [2.7]\n [8.5]\n [2.5]\n [4.8]\n [8.9]\n [4.5]] [[1.5]\n [3.2]\n [7.4]\n [2.5]\n [5.9]\n [3.8]\n [1.9]]\n[[86]\n [76]\n [17]\n [47]\n [85]\n [42]\n [81]\n [88]\n [67]\n [30]\n [25]\n [60]\n [30]\n [75]\n [21]\n [54]\n [95]\n [41]] [[20]\n [27]\n [69]\n [30]\n [62]\n [35]\n [24]]\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "#拆分数据,0.25作为测试集\n", "X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0) \n", "print(X_train,X_test)\n", "print(Y_train,Y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 训练线性回归" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "#使用训练集对模型进行训练\n", "regressor = LinearRegression()\n", "regressor = regressor.fit(X_train, Y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 预测结果" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[16.84472176]\n [33.74557494]\n [75.50062397]\n [26.7864001 ]\n [60.58810646]\n [39.71058194]\n [20.8213931 ]]\n[[20]\n [27]\n [69]\n [30]\n [62]\n [35]\n [24]]\n" ] } ], "source": [ "Y_pred = regressor.predict(X_test)\n", "print(Y_pred)\n", "print(Y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 可视化" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 训练集结果可视化" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "#散点图\n", "plt.scatter(X_train , Y_train, color = 'red')\n", "#线图\n", "plt.plot(X_train , regressor.predict(X_train), 'bo-')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 测试集结果可视化" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "#散点图\n", "plt.scatter(X_test , Y_test, color = 'red')\n", "#线图\n", "plt.plot(X_test ,Y_pred, 'bo-')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[3.2]\n [3.8]\n [1.1]\n [1.9]\n [1.5]\n [5.9]\n [7.8]] [[27]\n [35]\n [17]\n [24]\n [20]\n [62]\n [86]]\n" ] } ], "source": [ "print(X_test,Y_test)" ] } ], "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.8.3-final" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 2_Simple_Linear_Regression.md ================================================ # 简单线性回归模型

# 第一步:数据预处理 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt dataset = pd.read_csv('studentscores.csv') X = dataset.iloc[ : , : 1 ].values Y = dataset.iloc[ : , 1 ].values from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0) ``` # 第二步:训练集使用简单线性回归模型来训练 ```python from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor = regressor.fit(X_train, Y_train) ``` # 第三步:预测结果 ```python Y_pred = regressor.predict(X_test) ``` # 第四步:可视化 ## 训练集结果可视化 ```python plt.scatter(X_train , Y_train, color = 'red') plt.plot(X_train , regressor.predict(X_train), color ='blue') plt.show() ``` ## 测试集结果可视化 ```python plt.scatter(X_test , Y_test, color = 'red') plt.plot(X_test , regressor.predict(X_test), color ='blue') plt.show() ``` ================================================ FILE: Code/Day 2_Simple_Linear_Regression.py ================================================ # Data Preprocessing import pandas as pd import numpy as np import matplotlib.pyplot as plt dataset = pd.read_csv('../datasets/studentscores.csv') X = dataset.iloc[ : , : 1 ].values Y = dataset.iloc[ : , 1 ].values from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0) # Fitting Simple Linear Regression Model to the training set from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor = regressor.fit(X_train, Y_train) # Predecting the Result Y_pred = regressor.predict(X_test) # Visualising the Training results plt.scatter(X_train , Y_train, color = 'red') plt.plot(X_train , regressor.predict(X_train), color ='blue') # Visualizing the test results plt.scatter(X_test , Y_test, color = 'red') plt.plot(X_test , regressor.predict(X_test), color ='blue') plt.show() ================================================ FILE: Code/Day 34_Random_Forests.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "导入库" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "导入数据集" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "dataset = pd.read_csv('Social_Network_Ads.csv')\n", "X = dataset.iloc[:, [2, 3]].values\n", "y = dataset.iloc[:, 4].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将数据集拆分成训练集和测试集" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "特征缩放" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\softwareinstallation\\anaconda\\lib\\site-packages\\sklearn\\utils\\validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", " warnings.warn(msg, DataConversionWarning)\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "X_train = sc.fit_transform(X_train)\n", "X_test = sc.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "调试训练集的随机森林" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='entropy',\n", " max_depth=None, max_features='auto', max_leaf_nodes=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n", " oob_score=False, random_state=0, verbose=0, warm_start=False)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "预测测试集结果" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "y_pred = classifier.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "生成混淆矩阵,也称作误差矩阵" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "cm = confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将训练集结果可视化" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_train, y_train\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('Random Forest Classification (Training set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将测试集结果可视化" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set, y_set = X_test, y_test\n", "X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),\n", " np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(), X1.max())\n", "plt.ylim(X2.min(), X2.max())\n", "for i, j in enumerate(np.unique(y_set)):\n", " plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],\n", " c = ListedColormap(('red', 'green'))(i), label = j)\n", "plt.title('Random Forest Classification (Test set)')\n", "plt.xlabel('Age')\n", "plt.ylabel('Estimated Salary')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "##完成" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 34_Random_Forests.md ================================================ # 随机森林

## 导入库 ```Python import numpy as np import matplotlib.pyplot as plt import pandas as pd ``` ## 导入数据集 ```python dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values ``` ## 将数据集拆分成训练集和测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) ``` ## 特征缩放 ```python from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` ### 调试训练集的随机森林 ```python from sklearn.ensemble import RandomForestClassifier classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0) classifier.fit(X_train, y_train) ``` ## 预测测试集结果 ```python y_pred = classifier.predict(X_test) ``` ## 生成混淆矩阵,也称作误差矩阵 ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) ``` ## 将训练集结果可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Random Forest Classification (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ```

## 将测试集结果可视化 ```python from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Random Forest Classification (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ```

================================================ FILE: Code/Day 34_Random_Forests.py ================================================ # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Fitting Random Forest to the Training set from sklearn.ensemble import RandomForestClassifier classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0) classifier.fit(X_train, y_train) # Predicting the Test set results y_pred = classifier.predict(X_test) # Making the Confusion Matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) # Visualising the Training set results from matplotlib.colors import ListedColormap X_set, y_set = X_train, y_train X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Random Forest Classification (Training set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() # Visualising the Test set results from matplotlib.colors import ListedColormap X_set, y_set = X_test, y_test X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(), X1.max()) plt.ylim(X2.min(), X2.max()) for i, j in enumerate(np.unique(y_set)): plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) plt.title('Random Forest Classification (Test set)') plt.xlabel('Age') plt.ylabel('Estimated Salary') plt.legend() plt.show() ================================================ FILE: Code/Day 39.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## 安装库\n", "本例使用pycharm\n", "\n", "- 安装notebook\n", "\n", "```python\n", "pip install notebook\n", "```\n", "\n", "- 安装tensorflow\n", "\n", "本例使用了**tf-nightly**\n", "\n", "```python\n", "pip install tf-nightly\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", " from ._conv import register_converters as _register_converters\n" ] } ], "source": [ "#导入keras\n", "import tensorflow.keras as keras" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.12.0-dev20180926\n" ] } ], "source": [ "#导入tensorflow\n", "import tensorflow as tf\n", "print(tf.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 下载mnist数据\n", "keras默认从(https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz)下载,但国内很难连上,\n", "可以参考(http://www.cnblogs.com/shinny/p/9283372.html)。手动下载mnist.npz,然后修改mnist.py中的引用路径。\n", "如果找不到mnist.py,可以用everthing搜索。\n", "\n", "mnist.npz已上传到datasets文件夹,可从[这里]()下载。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136\n", " 175 26 166 255 247 127 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253\n", " 225 172 253 242 195 64 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251\n", " 93 82 82 56 39 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119\n", " 25 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253\n", " 150 27 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252\n", " 253 187 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249\n", " 253 249 64 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253\n", " 253 207 2 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253\n", " 250 182 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201\n", " 78 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]]\n" ] } ], "source": [ "mnist = tf.keras.datasets.mnist\n", "(x_train, y_train),(x_test, y_test) = mnist.load_data()\n", "print(x_train[0])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.imshow(x_train[0],cmap=plt.cm.binary)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(y_train[0])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.00393124 0.02332955 0.02620568 0.02625207 0.17420356 0.17566281\n", " 0.28629534 0.05664824 0.51877786 0.71632322 0.77892406 0.89301644\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.05780486 0.06524513 0.16128198 0.22713296\n", " 0.22277047 0.32790981 0.36833534 0.3689874 0.34978968 0.32678448\n", " 0.368094 0.3747499 0.79066747 0.67980478 0.61494005 0.45002403\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0.12250613 0.45858525 0.45852825 0.43408872 0.37314701\n", " 0.33153488 0.32790981 0.36833534 0.3689874 0.34978968 0.32420121\n", " 0.15214552 0.17865984 0.25626376 0.1573102 0.12298801 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0.04500225 0.4219755 0.45852825 0.43408872 0.37314701\n", " 0.33153488 0.32790981 0.28826244 0.26543758 0.34149427 0.31128482\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.1541463 0.28272888 0.18358693 0.37314701\n", " 0.33153488 0.26569767 0.01601458 0. 0.05945042 0.19891229\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.0253731 0.00171577 0.22713296\n", " 0.33153488 0.11664776 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.20500962\n", " 0.33153488 0.24625638 0.00291174 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.01622378\n", " 0.24897876 0.32790981 0.10191096 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.04586451 0.31235677 0.32757096 0.23335172 0.14931733 0.00129164\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.10498298 0.34940902 0.3689874 0.34978968 0.15370495\n", " 0.04089933 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.06551419 0.27127137 0.34978968 0.32678448\n", " 0.245396 0.05882702 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.02333517 0.12857881 0.32549285\n", " 0.41390126 0.40743158 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.32161793\n", " 0.41390126 0.54251585 0.20001074 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.06697006 0.18959827 0.25300993 0.32678448\n", " 0.41390126 0.45100715 0.00625034 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.05110617 0.19182076 0.33339444 0.3689874 0.34978968 0.32678448\n", " 0.40899334 0.39653769 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.04117838 0.16813739\n", " 0.28960162 0.32790981 0.36833534 0.3689874 0.34978968 0.25961929\n", " 0.12760592 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.04431706 0.11961607 0.36545809 0.37314701\n", " 0.33153488 0.32790981 0.36833534 0.28877275 0.111988 0.00258328\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0.05298497 0.42752138 0.4219755 0.45852825 0.43408872 0.37314701\n", " 0.33153488 0.25273681 0.11646967 0.01312603 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0.37491383 0.56222061\n", " 0.66525569 0.63253163 0.48748768 0.45852825 0.43408872 0.359873\n", " 0.17428513 0.01425695 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0.92705966 0.82698729\n", " 0.74473314 0.63253163 0.4084877 0.24466922 0.22648107 0.02359823\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_train = tf.keras.utils.normalize(x_train, axis=1)\n", "x_test = tf.keras.utils.normalize(x_test, axis=1)\n", "\n", "print(x_train[0])\n", "\n", "plt.imshow(x_train[0],cmap=plt.cm.binary)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "60000/60000 [==============================] - 15s 254us/step - loss: 0.2563 - acc: 0.9248\n", "Epoch 2/3\n", "60000/60000 [==============================] - 6s 107us/step - loss: 0.1081 - acc: 0.9665\n", "Epoch 3/3\n", "60000/60000 [==============================] - 7s 109us/step - loss: 0.0737 - acc: 0.9777\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = tf.keras.models.Sequential()\n", "model.add(tf.keras.layers.Flatten(input_shape=(28,28)))\n", "model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))\n", "model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))\n", "model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))\n", "model.compile(optimizer='adam',\n", " loss='sparse_categorical_crossentropy',\n", " metrics=['accuracy'])\n", "model.fit(x_train, y_train, epochs=3)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000/10000 [==============================] - 0s 46us/step\n", "0.09269746929686516\n", "0.9708\n" ] } ], "source": [ "val_loss, val_acc = model.evaluate(x_test, y_test)\n", "print(val_loss)\n", "print(val_acc)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[8.8540384e-09 1.2010514e-08 8.4797415e-07 ... 9.9985945e-01\n", " 4.4095773e-07 6.2582812e-06]\n", " [9.7641809e-08 8.4762014e-03 9.9100375e-01 ... 8.4532692e-09\n", " 1.1629361e-05 9.1832054e-12]\n", " [1.9781417e-09 9.9992287e-01 1.9637739e-05 ... 2.6759613e-05\n", " 2.1188511e-05 3.5105760e-08]\n", " ...\n", " [8.3089546e-10 7.8291782e-07 2.2996884e-08 ... 3.0950861e-04\n", " 3.1089010e-06 1.6785970e-04]\n", " [3.2990449e-08 2.2628739e-05 9.8154613e-09 ... 2.6752227e-06\n", " 1.8036989e-03 5.3969260e-09]\n", " [1.1823743e-06 7.2185024e-08 2.2751304e-07 ... 1.0656525e-10\n", " 3.2980407e-07 6.6678885e-09]]\n" ] } ], "source": [ "predictions = model.predict(x_test)\n", "print(predictions)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "import numpy as np\n", "\n", "print(np.argmax(predictions[0]))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADXdJREFUeJzt3W+IVfedx/HPx4l/gkpQnKjYyU5TxGwIrF0mspCwuJY0cWlifKDog2JC6fRBA1vogw0+aZ4shGXbbh4sJXYjGmjTlrRZJchugwRccQm5CdKk626U4NaJgzPGxFqCkYnffTDHMjVzz73ef+fOfN8vkHvv+Z5zzzcnfjz33t+59+eIEIB8FlTdAIBqEH4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSIrwA0nd1sudrVq1KoaHh3u5SyCVs2fP6uLFi25m3bbCb/sRSc9JGpD0rxHxbNn6w8PDqtVq7ewSQImRkZGm1235Zb/tAUn/ImmrpHsl7bZ9b6vPB6C32nnPv0nSmYh4PyKuSfqZpG2daQtAt7UT/nWSzs14PFYs+xO2R23XbNcmJyfb2B2ATmon/LN9qPC57wdHxL6IGImIkcHBwTZ2B6CT2gn/mKShGY+/IOl8e+0A6JV2wv+mpPW2v2h7kaRdkg53pi0A3dbyUF9ETNl+StJ/aHqob39E/LZjnQHoqrbG+SPiiKQjHeoFQA9xeS+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSIrwA0kRfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0iK8ANJtTVLr+2zkq5I+kzSVESMdKIpAN3XVvgLfxMRFzvwPAB6iJf9QFLthj8k/dr2W7ZHO9EQgN5o92X/AxFx3vadkl6z/T8RcWzmCsU/CqOSdNddd7W5OwCd0taZPyLOF7cTkl6RtGmWdfZFxEhEjAwODrazOwAd1HL4bS+1vfzGfUlflfRupxoD0F3tvOxfLekV2zee56cR8e8d6QpA17Uc/oh4X9JfdLAXAD3EUB+QFOEHkiL8QFKEH0iK8ANJEX4gqU58qy+FAwcO1K0dO3asbk2Sli1bVlpfunRpaX3Xrl2l9aGhobq1lStXlm6LvDjzA0kRfiApwg8kRfiBpAg/kBThB5Ii/EBSjPM36cknn6xb27BhQ+m2ly5dKq0vWrSotH706NHS+vbt2+vWhoeHS7e97bbyvwKXL18urUdEaX3Bgvrnl0b7npqaKq032v6TTz6pW1u7dm3pto8//nhpfT7gzA8kRfiBpAg/kBThB5Ii/EBShB9IivADSTHO36TDhw/XrX344Yel2zaapuzMmTOl9Q8++KC0vnjx4rq18fHx0m0bfd//3LlzpfVG4/wDAwN1a2V9S9LChQtL659++mlpvey4njhxonRbxvkBzFuEH0iK8ANJEX4gKcIPJEX4gaQIP5BUw3F+2/slfU3SRETcVyxbKennkoYlnZW0MyI+6l6b1Xv00Ue79txbtmxpa/urV6/WrU1OTpZuu3r16tL62NhYSz3dYLturdE4fqNrEJ5//vmWepKk+++/v+Vt54tmzvwHJD1y07KnJR2NiPWSjhaPAcwhDcMfEcck3fxTNNskHSzuH5Q0/y+HAuaZVt/zr46IcUkqbu/sXEsAeqHrH/jZHrVds11r9P4TQO+0Gv4LttdKUnE7UW/FiNgXESMRMTI4ONji7gB0WqvhPyxpT3F/j6RDnWkHQK80DL/tlyT9l6QNtsdsf0PSs5Iesn1a0kPFYwBzSMNx/ojYXaf0lQ73ghYtWbKkbm1oaKit57777rvb2r4dp06dKq2XXd8glf+3j46OttTTfMIVfkBShB9IivADSRF+ICnCDyRF+IGk+OluVKZsCm1JevXVV0vrjX42/LHHHqtbW7duXem2GXDmB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkGOdHZWq1Wmm90XUAy5cvL62vWbPmlnvKhDM/kBThB5Ii/EBShB9IivADSRF+ICnCDyTFOD+66ty5c3VrJ06caOu5d+zYUVrnO/vlOPMDSRF+ICnCDyRF+IGkCD+QFOEHkiL8QFINx/lt75f0NUkTEXFfsewZSd+UNFmstjcijnSrScxdp0+frlu7fv166baNpgdnHL89zZz5D0h6ZJblP4yIjcUfgg/MMQ3DHxHHJF3qQS8Aeqid9/xP2f6N7f22V3SsIwA90Wr4fyTpS5I2ShqX9P16K9oetV2zXZucnKy3GoAeayn8EXEhIj6LiOuSfixpU8m6+yJiJCJGBgcHW+0TQIe1FH7ba2c83C7p3c60A6BXmhnqe0nSZkmrbI9J+p6kzbY3SgpJZyV9q4s9AuiChuGPiN2zLH6hC71gDpqamiqtnzlzpm5tYGCgdNvNmzeX1hcs4Bq1dnD0gKQIP5AU4QeSIvxAUoQfSIrwA0nx091oy/Hjx0vr4+PjdWv33HNP6bZDQ0Mt9YTmcOYHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQY50ep9957r7T++uuvl9Zvv/32urUHH3ywpZ7QGZz5gaQIP5AU4QeSIvxAUoQfSIrwA0kRfiApxvmTu3r1amn9yJHyCZgjorS+fv36ujWm2K4WZ34gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSKrhOL/tIUkvSloj6bqkfRHxnO2Vkn4uaVjSWUk7I+Kj7rWKVjQahz906FBp/aOPyv+Xrly5srS+ZcuW0jqq08yZf0rSdyPizyX9laRv275X0tOSjkbEeklHi8cA5oiG4Y+I8Yh4u7h/RdIpSeskbZN0sFjtoKTHu9UkgM67pff8toclfVnSG5JWR8S4NP0PhKQ7O90cgO5pOvy2l0n6paTvRMTvb2G7Uds127XJyclWegTQBU2F3/ZCTQf/JxHxq2LxBdtri/paSROzbRsR+yJiJCJGBgcHO9EzgA5oGH7blvSCpFMR8YMZpcOS9hT390gq/9gYQF9p5iu9D0j6uqR3bJ8slu2V9KykX9j+hqTfSdrRnRbRjo8//ri0PjEx6wu2pm3durW0vmLFiraeH93TMPwRcVyS65S/0tl2APQKV/gBSRF+ICnCDyRF+IGkCD+QFOEHkuKnu+eBy5cv1629/PLLbT33ww8/XFrfsGFDW8+P6nDmB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkGOefB2q1Wt3alStXSrdduHBhaX14eLiVljAHcOYHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQY558DTp48WVp/44036taWLFnS6XYwT3DmB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkGo7z2x6S9KKkNZKuS9oXEc/ZfkbSNyVNFqvujYgj3Wo0s0bj/NeuXatbazTOf8cdd5TWFy1aVFrH3NXMRT5Tkr4bEW/bXi7pLduvFbUfRsQ/da89AN3SMPwRMS5pvLh/xfYpSeu63RiA7rql9/y2hyV9WdKN60mfsv0b2/ttr6izzajtmu3a5OTkbKsAqEDT4be9TNIvJX0nIn4v6UeSviRpo6ZfGXx/tu0iYl9EjETEyODgYAdaBtAJTYXf9kJNB/8nEfErSYqICxHxWURcl/RjSZu61yaATmsYftuW9IKkUxHxgxnL185YbbukdzvfHoBuaebT/gckfV3SO7ZvjDntlbTb9kZJIemspG91pUO0pdFbrZ07d5bWFy9e3Ml20Eea+bT/uCTPUmJMH5jDuMIPSIrwA0kRfiApwg8kRfiBpAg/kBQ/3T0HPPHEE1W3gHmIMz+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJOWI6N3O7ElJ/zdj0SpJF3vWwK3p1976tS+J3lrVyd7+LCKa+r28nob/czu3axExUlkDJfq1t37tS6K3VlXVGy/7gaQIP5BU1eHfV/H+y/Rrb/3al0Rvraqkt0rf8wOoTtVnfgAVqST8th+x/b+2z9h+uooe6rF91vY7tk/arlXcy37bE7bfnbFspe3XbJ8ubmedJq2i3p6x/UFx7E7a/tuKehuy/brtU7Z/a/vviuWVHruSvio5bj1/2W97QNJ7kh6SNCbpTUm7I+K/e9pIHbbPShqJiMrHhG3/taQ/SHoxIu4rlv2jpEsR8WzxD+eKiPj7PuntGUl/qHrm5mJCmbUzZ5aW9LikJ1ThsSvpa6cqOG5VnPk3SToTEe9HxDVJP5O0rYI++l5EHJN06abF2yQdLO4f1PRfnp6r01tfiIjxiHi7uH9F0o2ZpSs9diV9VaKK8K+TdG7G4zH115TfIenXtt+yPVp1M7NYXUybfmP69Dsr7udmDWdu7qWbZpbum2PXyozXnVZF+Geb/aefhhweiIi/lLRV0reLl7doTlMzN/fKLDNL94VWZ7zutCrCPyZpaMbjL0g6X0Efs4qI88XthKRX1H+zD1+4MUlqcTtRcT9/1E8zN882s7T64Nj104zXVYT/TUnrbX/R9iJJuyQdrqCPz7G9tPggRraXSvqq+m/24cOS9hT390g6VGEvf6JfZm6uN7O0Kj52/TbjdSUX+RRDGf8saUDS/oj4h543MQvbd2v6bC9N/7LxT6vszfZLkjZr+ltfFyR9T9K/SfqFpLsk/U7Sjojo+QdvdXrbrOmXrn+cufnGe+we9/agpP+U9I6k68XivZp+f13ZsSvpa7cqOG5c4QckxRV+QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeS+n+17MODM/tzuQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(x_test[0],cmap=plt.cm.binary)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# 保存模型\n", "model.save('epic_num_reader.model')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# 加载保存的模型\n", "new_model = tf.keras.models.load_model('epic_num_reader.model')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "# 测试保存的模型\n", "predictions = new_model.predict(x_test)\n", "print(np.argmax(predictions[0]))" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: Code/Day 3_Multiple_Linear_Regression.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第3天:多元线性回归(Multiple Linear Regression)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第1步:数据预处理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**导入库**" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**导入数据集**" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "X:\n[[165349.2 136897.8 471784.1 'New York']\n [162597.7 151377.59 443898.53 'California']\n [153441.51 101145.55 407934.54 'Florida']\n [144372.41 118671.85 383199.62 'New York']\n [142107.34 91391.77 366168.42 'Florida']\n [131876.9 99814.71 362861.36 'New York']\n [134615.46 147198.87 127716.82 'California']\n [130298.13 145530.06 323876.68 'Florida']\n [120542.52 148718.95 311613.29 'New York']\n [123334.88 108679.17 304981.62 'California']]\nY:\n[192261.83 191792.06 191050.39 182901.99 166187.94 156991.12 156122.51\n 155752.6 152211.77 149759.96 146121.95 144259.4 141585.52 134307.35\n 132602.65 129917.04 126992.93 125370.37 124266.9 122776.86 118474.03\n 111313.02 110352.25 108733.99 108552.04 107404.34 105733.54 105008.31\n 103282.38 101004.64 99937.59 97483.56 97427.84 96778.92 96712.8\n 96479.51 90708.19 89949.14 81229.06 81005.76 78239.91 77798.83\n 71498.49 69758.98 65200.33 64926.08 49490.75 42559.73 35673.41\n 14681.4 ]\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ " R&D Spend Administration Marketing Spend State Profit\n", "0 165349.20 136897.80 471784.10 New York 192261.83\n", "1 162597.70 151377.59 443898.53 California 191792.06\n", "2 153441.51 101145.55 407934.54 Florida 191050.39\n", "3 144372.41 118671.85 383199.62 New York 182901.99\n", "4 142107.34 91391.77 366168.42 Florida 166187.94" ], "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
R&D SpendAdministrationMarketing SpendStateProfit
0165349.20136897.80471784.10New York192261.83
1162597.70151377.59443898.53California191792.06
2153441.51101145.55407934.54Florida191050.39
3144372.41118671.85383199.62New York182901.99
4142107.3491391.77366168.42Florida166187.94
\n
" }, "metadata": {}, "execution_count": 57 } ], "source": [ "dataset = pd.read_csv('../datasets/50_Startups.csv')\n", "X = dataset.iloc[ : , :-1].values\n", "Y = dataset.iloc[ : , 4 ].values\n", "Z = dataset.iloc[ : , 0 ].values\n", "print(\"X:\")\n", "print(X[:10])\n", "print(\"Y:\")\n", "print(Y)\n", "dataset.head(5)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[165349.2 136897.8 471784.1 'New York']\n [162597.7 151377.59 443898.53 'California']\n [153441.51 101145.55 407934.54 'Florida']\n [144372.41 118671.85 383199.62 'New York']\n [142107.34 91391.77 366168.42 'Florida']\n [131876.9 99814.71 362861.36 'New York']\n [134615.46 147198.87 127716.82 'California']\n [130298.13 145530.06 323876.68 'Florida']\n [120542.52 148718.95 311613.29 'New York']\n [123334.88 108679.17 304981.62 'California']\n [101913.08 110594.11 229160.95 'Florida']\n [100671.96 91790.61 249744.55 'California']\n [93863.75 127320.38 249839.44 'Florida']\n [91992.39 135495.07 252664.93 'California']\n [119943.24 156547.42 256512.92 'Florida']\n [114523.61 122616.84 261776.23 'New York']\n [78013.11 121597.55 264346.06 'California']\n [94657.16 145077.58 282574.31 'New York']\n [91749.16 114175.79 294919.57 'Florida']\n [86419.7 153514.11 224494.78489361703 'New York']\n [76253.86 113867.3 298664.47 'California']\n [78389.47 153773.43 299737.29 'New York']\n [73994.56 122782.75 303319.26 'Florida']\n [67532.53 105751.03 304768.73 'Florida']\n [77044.01 99281.34 140574.81 'New York']\n [64664.71 139553.16 137962.62 'California']\n [75328.87 144135.98 134050.07 'Florida']\n [72107.6 127864.55 353183.81 'New York']\n [66051.52 182645.56 118148.2 'Florida']\n [65605.48 153032.06 107138.38 'New York']\n [61994.48 115641.28 91131.24 'Florida']\n [61136.38 152701.92 88218.23 'New York']\n [63408.86 129219.61 46085.25 'California']\n [55493.95 103057.49 214634.81 'Florida']\n [46426.07 157693.92 210797.67 'California']\n [46014.02 85047.44 205517.64 'New York']\n [28663.76 127056.21 201126.82 'Florida']\n [44069.95 51283.14 197029.42 'California']\n [20229.59 65947.93 185265.1 'New York']\n [38558.51 82982.09 174999.3 'California']\n [28754.33 118546.05 172795.67 'California']\n [27892.92 84710.77 164470.71 'Florida']\n [23640.93 96189.63 148001.11 'California']\n [15505.73 127382.3 35534.17 'New York']\n [22177.74 154806.14 28334.72 'California']\n [1000.23 124153.04 1903.93 'New York']\n [1315.46 115816.21 297114.46 'Florida']\n [76793.34958333334 135426.92 224494.78489361703 'California']\n [542.05 51743.15 224494.78489361703 'New York']\n [76793.34958333334 116983.8 45173.06 'California']]\n" ] } ], "source": [ "from sklearn.impute import SimpleImputer\n", "imputer = SimpleImputer(missing_values=0.0, strategy=\"mean\")\n", "imputer = imputer.fit(X[ : , 0:3])\n", "X[ : , 0:3] = imputer.transform(X[ : , 0:3])\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**将类别数据数字化**" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "original:\n[[165349.2 136897.8 471784.1 'New York']\n [162597.7 151377.59 443898.53 'California']\n [153441.51 101145.55 407934.54 'Florida']\n [144372.41 118671.85 383199.62 'New York']\n [142107.34 91391.77 366168.42 'Florida']\n [131876.9 99814.71 362861.36 'New York']\n [134615.46 147198.87 127716.82 'California']\n [130298.13 145530.06 323876.68 'Florida']\n [120542.52 148718.95 311613.29 'New York']\n [123334.88 108679.17 304981.62 'California']]\nlabelencoder:\n[[165349.2 136897.8 471784.1 2]\n [162597.7 151377.59 443898.53 0]\n [153441.51 101145.55 407934.54 1]\n [144372.41 118671.85 383199.62 2]\n [142107.34 91391.77 366168.42 1]\n [131876.9 99814.71 362861.36 2]\n [134615.46 147198.87 127716.82 0]\n [130298.13 145530.06 323876.68 1]\n [120542.52 148718.95 311613.29 2]\n [123334.88 108679.17 304981.62 0]]\nonehot:\n[[0.0 0.0 1.0 165349.2 136897.8 471784.1]\n [1.0 0.0 0.0 162597.7 151377.59 443898.53]\n [0.0 1.0 0.0 153441.51 101145.55 407934.54]\n [0.0 0.0 1.0 144372.41 118671.85 383199.62]\n [0.0 1.0 0.0 142107.34 91391.77 366168.42]\n [0.0 0.0 1.0 131876.9 99814.71 362861.36]\n [1.0 0.0 0.0 134615.46 147198.87 127716.82]\n [0.0 1.0 0.0 130298.13 145530.06 323876.68]\n [0.0 0.0 1.0 120542.52 148718.95 311613.29]\n [1.0 0.0 0.0 123334.88 108679.17 304981.62]]\n" ] } ], "source": [ "from sklearn.preprocessing import LabelEncoder, OneHotEncoder\n", "from sklearn.compose import ColumnTransformer \n", "labelencoder = LabelEncoder()\n", "print(\"original:\")\n", "print(X[:10])\n", "#print(X[: , 3])\n", "X[: , 3] = labelencoder.fit_transform(X[ : , 3])\n", "#print(X[: , 3])\n", "print(\"labelencoder:\")\n", "print(X[:10])\n", "ct = ColumnTransformer([( \"encoder\", OneHotEncoder(), [3])], remainder = 'passthrough')\n", "X = ct.fit_transform(X)\n", "#onehotencoder = OneHotEncoder(categorical_features = [3])\n", "#X = onehotencoder.fit_transform(X).toarray()\n", "print(\"onehot:\")\n", "print(X[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**躲避虚拟变量陷阱**\n", "\n", "在回归预测中我们需要所有的数据都是numeric的,但是会有一些非numeric的数据,比如国家,省,部门,性别。这时候我们需要设置虚拟变量(Dummy variable)。做法是将此变量中的每一个值,衍生成为新的变量,是设为1,否设为0.举个例子,“性别”这个变量,我们可以虚拟出“男”和”女”两虚拟变量,男性的话“男”值为1,”女”值为0;女性的话“男”值为0,”女”值为1。\n", "\n", "但是要注意,这时候虚拟变量陷阱就出现了。就拿性别来说,其实一个虚拟变量就够了,比如 1 的时候是“男”, 0 的时候是”非男”,即为女。如果设置两个虚拟变量“男”和“女”,语义上来说没有问题,可以理解,但是在回归预测中会多出一个变量,多出的这个变量将会对回归预测结果产生影响。一般来说,如果虚拟变量要比实际变量的种类少一个。 \n", "\n", "在多重线性回归中,变量不是越多越好,而是选择适合的变量。这样才会对结果准确预测。如果category类的特征都放进去,拟合的时候,所有权重的计算,都可以有两种方法实现,一种是提高某个category的w,一种是降低其他category的w,这两种效果是等效的,也就是发生了共线性,虚拟变量系数相加和为1,出现完全共线陷阱。\n", "\n", "**但是下面测试尽然和想法不一致。。。**" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "X1 = X[: , 1:]" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0.0 1.0 165349.2 136897.8 471784.1]\n [0.0 0.0 162597.7 151377.59 443898.53]\n [1.0 0.0 153441.51 101145.55 407934.54]\n [0.0 1.0 144372.41 118671.85 383199.62]\n [1.0 0.0 142107.34 91391.77 366168.42]\n [0.0 1.0 131876.9 99814.71 362861.36]\n [0.0 0.0 134615.46 147198.87 127716.82]\n [1.0 0.0 130298.13 145530.06 323876.68]\n [0.0 1.0 120542.52 148718.95 311613.29]\n [0.0 0.0 123334.88 108679.17 304981.62]\n [1.0 0.0 101913.08 110594.11 229160.95]\n [0.0 0.0 100671.96 91790.61 249744.55]\n [1.0 0.0 93863.75 127320.38 249839.44]\n [0.0 0.0 91992.39 135495.07 252664.93]\n [1.0 0.0 119943.24 156547.42 256512.92]\n [0.0 1.0 114523.61 122616.84 261776.23]\n [0.0 0.0 78013.11 121597.55 264346.06]\n [0.0 1.0 94657.16 145077.58 282574.31]\n [1.0 0.0 91749.16 114175.79 294919.57]\n [0.0 1.0 86419.7 153514.11 224494.78489361703]\n [0.0 0.0 76253.86 113867.3 298664.47]\n [0.0 1.0 78389.47 153773.43 299737.29]\n [1.0 0.0 73994.56 122782.75 303319.26]\n [1.0 0.0 67532.53 105751.03 304768.73]\n [0.0 1.0 77044.01 99281.34 140574.81]\n [0.0 0.0 64664.71 139553.16 137962.62]\n [1.0 0.0 75328.87 144135.98 134050.07]\n [0.0 1.0 72107.6 127864.55 353183.81]\n [1.0 0.0 66051.52 182645.56 118148.2]\n [0.0 1.0 65605.48 153032.06 107138.38]\n [1.0 0.0 61994.48 115641.28 91131.24]\n [0.0 1.0 61136.38 152701.92 88218.23]\n [0.0 0.0 63408.86 129219.61 46085.25]\n [1.0 0.0 55493.95 103057.49 214634.81]\n [0.0 0.0 46426.07 157693.92 210797.67]\n [0.0 1.0 46014.02 85047.44 205517.64]\n [1.0 0.0 28663.76 127056.21 201126.82]\n [0.0 0.0 44069.95 51283.14 197029.42]\n [0.0 1.0 20229.59 65947.93 185265.1]\n [0.0 0.0 38558.51 82982.09 174999.3]\n [0.0 0.0 28754.33 118546.05 172795.67]\n [1.0 0.0 27892.92 84710.77 164470.71]\n [0.0 0.0 23640.93 96189.63 148001.11]\n [0.0 1.0 15505.73 127382.3 35534.17]\n [0.0 0.0 22177.74 154806.14 28334.72]\n [0.0 1.0 1000.23 124153.04 1903.93]\n [1.0 0.0 1315.46 115816.21 297114.46]\n [0.0 0.0 76793.34958333334 135426.92 224494.78489361703]\n [0.0 1.0 542.05 51743.15 224494.78489361703]\n [0.0 0.0 76793.34958333334 116983.8 45173.06]]\n[[0.0 0.0 1.0 165349.2 136897.8 471784.1]\n [1.0 0.0 0.0 162597.7 151377.59 443898.53]\n [0.0 1.0 0.0 153441.51 101145.55 407934.54]\n [0.0 0.0 1.0 144372.41 118671.85 383199.62]\n [0.0 1.0 0.0 142107.34 91391.77 366168.42]\n [0.0 0.0 1.0 131876.9 99814.71 362861.36]\n [1.0 0.0 0.0 134615.46 147198.87 127716.82]\n [0.0 1.0 0.0 130298.13 145530.06 323876.68]\n [0.0 0.0 1.0 120542.52 148718.95 311613.29]\n [1.0 0.0 0.0 123334.88 108679.17 304981.62]\n [0.0 1.0 0.0 101913.08 110594.11 229160.95]\n [1.0 0.0 0.0 100671.96 91790.61 249744.55]\n [0.0 1.0 0.0 93863.75 127320.38 249839.44]\n [1.0 0.0 0.0 91992.39 135495.07 252664.93]\n [0.0 1.0 0.0 119943.24 156547.42 256512.92]\n [0.0 0.0 1.0 114523.61 122616.84 261776.23]\n [1.0 0.0 0.0 78013.11 121597.55 264346.06]\n [0.0 0.0 1.0 94657.16 145077.58 282574.31]\n [0.0 1.0 0.0 91749.16 114175.79 294919.57]\n [0.0 0.0 1.0 86419.7 153514.11 224494.78489361703]\n [1.0 0.0 0.0 76253.86 113867.3 298664.47]\n [0.0 0.0 1.0 78389.47 153773.43 299737.29]\n [0.0 1.0 0.0 73994.56 122782.75 303319.26]\n [0.0 1.0 0.0 67532.53 105751.03 304768.73]\n [0.0 0.0 1.0 77044.01 99281.34 140574.81]\n [1.0 0.0 0.0 64664.71 139553.16 137962.62]\n [0.0 1.0 0.0 75328.87 144135.98 134050.07]\n [0.0 0.0 1.0 72107.6 127864.55 353183.81]\n [0.0 1.0 0.0 66051.52 182645.56 118148.2]\n [0.0 0.0 1.0 65605.48 153032.06 107138.38]\n [0.0 1.0 0.0 61994.48 115641.28 91131.24]\n [0.0 0.0 1.0 61136.38 152701.92 88218.23]\n [1.0 0.0 0.0 63408.86 129219.61 46085.25]\n [0.0 1.0 0.0 55493.95 103057.49 214634.81]\n [1.0 0.0 0.0 46426.07 157693.92 210797.67]\n [0.0 0.0 1.0 46014.02 85047.44 205517.64]\n [0.0 1.0 0.0 28663.76 127056.21 201126.82]\n [1.0 0.0 0.0 44069.95 51283.14 197029.42]\n [0.0 0.0 1.0 20229.59 65947.93 185265.1]\n [1.0 0.0 0.0 38558.51 82982.09 174999.3]\n [1.0 0.0 0.0 28754.33 118546.05 172795.67]\n [0.0 1.0 0.0 27892.92 84710.77 164470.71]\n [1.0 0.0 0.0 23640.93 96189.63 148001.11]\n [0.0 0.0 1.0 15505.73 127382.3 35534.17]\n [1.0 0.0 0.0 22177.74 154806.14 28334.72]\n [0.0 0.0 1.0 1000.23 124153.04 1903.93]\n [0.0 1.0 0.0 1315.46 115816.21 297114.46]\n [1.0 0.0 0.0 76793.34958333334 135426.92 224494.78489361703]\n [0.0 0.0 1.0 542.05 51743.15 224494.78489361703]\n [1.0 0.0 0.0 76793.34958333334 116983.8 45173.06]]\n" ] } ], "source": [ "print(X1)\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**拆分数据集为训练集和测试集**" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0.0 1.0 0.0 66051.52 182645.56 118148.2]\n [1.0 0.0 0.0 100671.96 91790.61 249744.55]\n [0.0 1.0 0.0 101913.08 110594.11 229160.95]\n [0.0 1.0 0.0 27892.92 84710.77 164470.71]\n [0.0 1.0 0.0 153441.51 101145.55 407934.54]\n [0.0 0.0 1.0 72107.6 127864.55 353183.81]\n [0.0 0.0 1.0 20229.59 65947.93 185265.1]\n [0.0 0.0 1.0 61136.38 152701.92 88218.23]\n [0.0 1.0 0.0 73994.56 122782.75 303319.26]\n [0.0 1.0 0.0 142107.34 91391.77 366168.42]]\n[103282.38 144259.4 146121.95 77798.83 191050.39 105008.31 81229.06\n 97483.56 110352.25 166187.94]\n[[1.0 0.0 66051.52 182645.56 118148.2]\n [0.0 0.0 100671.96 91790.61 249744.55]\n [1.0 0.0 101913.08 110594.11 229160.95]\n [1.0 0.0 27892.92 84710.77 164470.71]\n [1.0 0.0 153441.51 101145.55 407934.54]\n [0.0 1.0 72107.6 127864.55 353183.81]\n [0.0 1.0 20229.59 65947.93 185265.1]\n [0.0 1.0 61136.38 152701.92 88218.23]\n [1.0 0.0 73994.56 122782.75 303319.26]\n [1.0 0.0 142107.34 91391.77 366168.42]]\n[103282.38 144259.4 146121.95 77798.83 191050.39 105008.31 81229.06\n 97483.56 110352.25 166187.94]\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)\n", "X1_train, X1_test, Y1_train, Y1_test = train_test_split(X1, Y, test_size = 0.2, random_state = 0)\n", "print(X_test)\n", "print(Y_test)\n", "print(X1_test)\n", "print(Y1_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第2步:在训练集上训练多元线性回归模型" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "LinearRegression()" ] }, "metadata": {}, "execution_count": 64 } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "regressor = LinearRegression()\n", "regressor.fit(X_train, Y_train)\n", "regressor1 = LinearRegression()\n", "regressor1.fit(X1_train, Y1_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第3步:在测试集上预测结果¶" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "y_pred = regressor.predict(X_test)\n", "y1_pred = regressor1.predict(X1_test)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[102388.94113041 121465.72713517 127340.57708619 71709.47538912\n 174211.0848 121771.65061494 68393.54360668 95588.5313349\n 116596.3467699 162514.07218551]\n[102388.94113046 121465.72713518 127340.57708619 71709.47538916\n 174211.08479987 121771.65061482 68393.5436067 95588.53133498\n 116596.34676982 162514.07218541]\n" ] } ], "source": [ "print(y_pred)\n", "print(y1_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**完整的项目请前往Github项目100-Days-Of-ML-Code查看。有任何的建议或者意见欢迎在issue中提出~**" ] } ], "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.8.3-final" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 3_Multiple_Linear_Regression.md ================================================ # 多元线性回归

## 第1步: 数据预处理 ### 导入库 ```python import pandas as pd import numpy as np ``` ### 导入数据集 ```python dataset = pd.read_csv('50_Startups.csv') X = dataset.iloc[ : , :-1].values Y = dataset.iloc[ : , 4 ].values ``` ### 将类别数据数字化 ```python from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder = LabelEncoder() X[: , 3] = labelencoder.fit_transform(X[ : , 3]) onehotencoder = OneHotEncoder(categorical_features = [3]) X = onehotencoder.fit_transform(X).toarray() ``` ### 躲避虚拟变量陷阱 ```python X = X[: , 1:] ``` ### 拆分数据集为训练集和测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0) ``` ## 第2步: 在训练集上训练多元线性回归模型 ```python from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, Y_train) ``` ## Step 3: 在测试集上预测结果 ```python y_pred = regressor.predict(X_test) ``` ================================================ FILE: Code/Day 3_Multiple_Linear_Regression.py ================================================ # Importing the libraries import pandas as pd import numpy as np # Importing the dataset dataset = pd.read_csv('../datasets/50_Startups.csv') X = dataset.iloc[ : , :-1].values Y = dataset.iloc[ : , 4 ].values # Encoding Categorical data from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder = LabelEncoder() X[: , 3] = labelencoder.fit_transform(X[ : , 3]) onehotencoder = OneHotEncoder(categorical_features = [3]) X = onehotencoder.fit_transform(X).toarray() # Avoiding Dummy Variable Trap X = X[: , 1:] # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0) # Fitting Multiple Linear Regression to the Training set from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, Y_train) # Predicting the Test set results y_pred = regressor.predict(X_test) # regression evaluation from sklearn.metrics import r2_score print(r2_score(Y_test, y_pred)) ================================================ FILE: Code/Day 40.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 准备\n", "\n", "- 数据集下载地址请点此处。(数据集大小约750多MB)\n", "
解压缩数据集,会发现它创建了一个名为PetImages的目录。在其中,有猫和狗目录,然后填充猫和狗的图像。\n", "\n", "- 需要matplotlib库\n", "
可通过以下方式安装(如果已有opencv请跳过第二行)\n", "```shell\n", "pip install matpltlib\n", "pip install opencv-python\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "要先对数据集中的图片进行处理,可能需要进行的任务有图像尺寸统一、颜色处理等:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJkAAAD8CAYAAABkZQZTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWmMpfd13vm8d9/3e2vtru7qheyFFCUvlEg6MEgrUawx\nLChB5AwyGANBggAzGBgYIIk/BPMpQIAgASYfBogRB5MJPGPHduAZJIK1gpYFS9yXZpPd7GZXd1XX\nfvdbd1/e+VD8nfpXy7KKGdEpDvgCha6uunXvu5z/Oc95znPO3/N9X58enx4f5xH4r30Cnx7//z8+\nNbJPj4/9+NTIPj0+9uNTI/v0+NiPT43s0+NjPz41sk+Pj/342IzM87wveZ532/O8u57n/eOP63M+\nPU7/4X0cPJnneUFJ70v6oqSHkl6R9Ld933/3p/5hnx6n/vi4PNnPS7rr+/493/dHkn5X0q9+TJ/1\n6XHKj9DH9L5Lkjac/z+U9PSPe3EymfTz+bwkyfM8eZ6n8XisRCKh0Wik6XSqQCBg//q+L8/zFAgE\nNJvN9Kg39jxPs9nM3sv3fQWDQUnSZDJRMBiU7/v25Xme/d7zvGOvkaTpdCpJx/4uGAwee2/+xv1s\n3/c1m80kSaFQSJPJRNPp1D7PPUcOrmk2m9n3kuxfXsPfuJ/H7zhffuaej/t5fI57f/i57/v2OXzP\n/eN6tra2qr7vl3/cc+X4uIzsJx6e5/19SX9fkrLZrH7jN35DgUBAvV5PoVBIzWZT+Xxes9lMo9FI\nkUhEnU5HiURC4/FYgUBAwWBQo9HIbqzneYpEIpKk8Xgs3/cVj8c1HA7tdb1eT5lMRqPRSNFoVIPB\nQHNzc8rlcmo2m4rFYnr48KEZRSwWk+/7mk6nmk6n8n1f4XBYk8lE2WxWnucpl8tpf39f5XJZvu8r\nFDq8rbPZTM1mU4PBQOl0WqPRSP1+X5PJRLlcTjs7O0okEsrn8xoMBsrlcgqHw9rf39d0OlU2m1W/\n39fBwYHG47Hi8bja7bZKpZJCoZBGo5ESiYQmk4lGo5EGg4Hds36/r3g8rn6/r52dHWWzWf3Mz/yM\nms2m7ty5o2g0auc3mUw0HA4Vj8eVTqeVSqW0u7tr9wljzGQyqtfrCgaDymaz+if/5J88OMmz/riM\nbFPSGef/yx/+zA7f939L0m9J0uLioj+ZTBSJRBSNRhUOh5VIJNRoNFSpVJRIJBQMBhUKhTQYDCQd\n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\nTxCndIBDMcD0u6oEQPXc3JzxTNzoe/fu2QOB1QfHcC1ulzgVCOZkIDuC3oDvcj0zGM2VJUmyjbvq\n9boZ7e7urjY3N3X37l2b1waGxOMT/qjRIsjkvV1aAg0eWSmQgrptv99XtVr9S5njP+f7/vaH3+9I\nmvvw+yVJP3Re9/DDn/3I4Tm7xDFphwuGPMTYyBRpiO10OopEIrbJFAYGvmCY3r179+zzwHuoLfCC\njGFi8G6pVFIwGFSr1VIikdDu7q7K5bIymYwePnxoMh6qCEwwZNMuJjZOJhN1u12bvSHJehUk/Yi0\nByOQjsA/nqxer2t+fl7vvvuuyZzIql38+eqrr+ry5ctqtVo2RBC8SEICNHDnoAFBGOO5v79vQsxC\noaDBYKBz585Z+W88HluicJLj/zMZ6x+6oY+8/a/v+7/l+/7P+r7/s0iZ3UFuSJc9z9Pjjz+uaDSq\n27dv6/6Ho82R4CAuRL0Zj8dVrVa1tLSkF1988diwEt53Oj3c86harVrGBCe1t7dnIxJCoZBhLxpo\nYeXBW8ViUYuLi5JknpCxCzdu3NB4PFapVDIjAmDDzbnELKGSyga4iT5PlwBeWVmxbQdRUmQyGe3t\n7RlBiwG56hUwLFULSFcI32azqbt371pWGwqFtLi4aN4PPrLRaJz4Wf+XerJdz/MWfN/f9jxvQdLe\nhz//iVsQ/nkHF4oBMMwknU7r4sWLWltb0+7uru29dOPGDcMXjAWIRA73+6F4GwodTtjZ29uzLJAQ\nQ0s/pCwGWy6XlU6ntbi4qHK5bH0Bk8nhbnL5fN72MIJeYWo2CcSFCxfk+75u3Lihe/fumRgSRp89\nLrlGV92BenY2mxnjz0DA3/u939OVK1dsqjczz9irk8nfr732mo1WwIOBy5hESfEfQQLwg06lUqmk\nSCSicrmser1uauFCoWCbqD3zzDP63d/93RMZy3+pkf0/kv57Sf/sw3//b+fn/6fnef9S0qKkS5Je\nPskbgr+40fBQa2trNld+Npvp4sWL2t7eVqfTUT6fP0aQMkYJEE5WOh6PtbW1dayx49atW9rY2LA5\n+0i4pcOwBnmJKjSfz1s4WV9fVzQa1bVr17S7u2uGMRgM9Cd/8ifHOpvm5+d1/fp1Pf/885pOp3r7\n7bd18+ZN7e7uGuYDD4LL4LHcKdT379/X8vKy4vG4JSlsJQhuZU4bXhIPjYKXgj+aOxdTTqdTra2t\n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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import os\n", "import cv2\n", "from tqdm import tqdm\n", "\n", "DATADIR = \"../datasets/PetImages\" # 数据集的路径,请根据需要修改\n", "\n", "CATEGORIES = [\"Dog\", \"Cat\"]\n", "\n", "for category in CATEGORIES: \n", " path = os.path.join(DATADIR,category) # 创建路径\n", " for img in os.listdir(path): # 迭代遍历每个图片\n", " img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE) # 转化成array\n", " plt.imshow(img_array, cmap='gray') # 转换成图像展示\n", " plt.show() # display!\n", "\n", " break # 我们作为演示只展示一张,所以直接break了\n", " break #同上" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看下array中存储的图像数据:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[144 137 136 ..., 125 134 134]\n", " [140 132 133 ..., 122 129 129]\n", " [139 131 133 ..., 126 132 132]\n", " ..., \n", " [128 133 139 ..., 137 137 137]\n", " [138 139 139 ..., 137 137 137]\n", " [138 139 139 ..., 137 137 137]]\n" ] } ], "source": [ "print(img_array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看下array的形状:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(467, 235)\n" ] } ], "source": [ "print(img_array.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们可以看到这是一张很大的图片,并且拥有RGB3个通道,这并不是我们想要的,所以接下来我们将要进行的操作会使图像变小,并且只剩下灰度:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\naaBfUAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "IMG_SIZE = 50\n", "\n", "new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))\n", "plt.imshow(new_array, cmap='gray')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SIZE设置成50有一些模糊,尝试下100:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "IMG_SIZE = 100\n", "new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))\n", "plt.imshow(new_array, cmap='gray')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "接下来,我们将要创建所有这些培训数据,但是,首先,我们应该留出一些图像进行最终测试。我将手动创建一个名为Testing的目录,然后在其中创建2个目录,一个用于Dog,一个用于Cat。从这里开始,我将把Dog和Cat的前15张图像移到训练版本中。确保移动它们,而不是复制。我们将使用它进行最终测试。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 12501/12501 [00:37<00:00, 331.36it/s]\n", "100%|██████████| 12501/12501 [00:35<00:00, 350.78it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "24946\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "training_data = []\n", "\n", "def create_training_data():\n", " for category in CATEGORIES: \n", "\n", " path = os.path.join(DATADIR,category) \n", " class_num = CATEGORIES.index(category) # 得到分类,其中 0=dog 1=cat\n", "\n", " for img in tqdm(os.listdir(path)): \n", " try:\n", " img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE) \n", " new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) # 大小转换\n", " training_data.append([new_array, class_num]) # 加入训练数据中\n", " except Exception as e: # 为了保证输出是整洁的\n", " pass\n", " #except OSError as e:\n", " # print(\"OSErrroBad img most likely\", e, os.path.join(path,img))\n", " #except Exception as e:\n", " # print(\"general exception\", e, os.path.join(path,img))\n", "\n", "create_training_data()\n", "\n", "print(len(training_data))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们有大约25,000张图片。\n", "
我们要做的一件事是确保我们的数据是平衡的。在这个数据集的情况下,我可以看到数据集开始时是平衡的。平衡,我的意思是每个班级都有相同数量的例子(相同数量的狗和猫)。如果不平衡,您要么将类权重传递给模型,以便它可以适当地测量误差,或者通过将较大的集修剪为与较小集相同的大小来平衡样本。\n", "
现在数据集中要么全是dog要么全是cat,因此接下来要引入随机:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import random\n", "\n", "random.shuffle(training_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们的training_data是一个列表,这意味着它是可变的,所以它现在很好地改组了。我们可以通过迭代几个初始样本并打印出类来确认这一点:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n" ] } ], "source": [ "for sample in training_data[:10]:\n", " print(sample[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在可以看到已经是0、1交替了,我们可以开始我们的模型了:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[[ 95]\n", " [ 79]\n", " [107]\n", " ..., \n", " [ 31]\n", " [ 59]\n", " [ 75]]\n", "\n", " [[ 56]\n", " [116]\n", " [104]\n", " ..., \n", " [ 84]\n", " [ 33]\n", " [ 43]]\n", "\n", " [[ 23]\n", " [ 54]\n", " [ 45]\n", " ..., \n", " [ 97]\n", " [ 46]\n", " [ 90]]\n", "\n", " ..., \n", " [[179]\n", " [101]\n", " [120]\n", " ..., \n", " [166]\n", " [150]\n", " [146]]\n", "\n", " [[128]\n", " [103]\n", " [127]\n", " ..., \n", " [153]\n", " [112]\n", " [142]]\n", "\n", " [[145]\n", " [117]\n", " [158]\n", " ..., \n", " [125]\n", " [ 79]\n", " [145]]]]\n" ] } ], "source": [ "X = []\n", "y = []\n", "\n", "for features,label in training_data:\n", " X.append(features)\n", " y.append(label)\n", "\n", "print(X[0].reshape(-1, IMG_SIZE, IMG_SIZE, 1))\n", "\n", "X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "让我们保存这些数据,这样我们就不需要每次想要使用神经网络模型时继续计算它:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import pickle\n", "\n", "pickle_out = open(\"../datasets/X.pickle\",\"wb\")\n", "pickle.dump(X, pickle_out)\n", "pickle_out.close()\n", "\n", "pickle_out = open(\"../datasets/y.pickle\",\"wb\")\n", "pickle.dump(y, pickle_out)\n", "pickle_out.close()\n", "# We can always load it in to our current script, or a totally new one by doing:\n", "\n", "pickle_in = open(\"../datasets/X.pickle\",\"rb\")\n", "X = pickle.load(pickle_in)\n", "\n", "pickle_in = open(\"../datasets/y.pickle\",\"rb\")\n", "y = pickle.load(pickle_in)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在我们已经拿出了数据集,我们已经准备好覆盖卷积神经网络,并用我们的数据进行分类。\n", "
以上就是这次的关于数据集操作的全部任务。" ] } ], "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 41.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 基础知识\n", "基本的CNN结构如下: Convolution(卷积) -> Pooling(池化) -> Convolution -> Pooling -> Fully Connected Layer(全连接层) -> Output\n", "\n", "Convolution(卷积)是获取原始数据并从中创建特征映射的行为。Pooling(池化)是下采样,通常以“max-pooling”的形式,我们选择一个区域,然后在该区域中取最大值,这将成为整个区域的新值。Fully Connected Layers(全连接层)是典型的神经网络,其中所有节点都“完全连接”。卷积层不像传统的神经网络那样完全连接。\n", "\n", "卷积:我们将采用某个窗口,并在该窗口中查找要素,该窗口的功能现在只是新功能图中的一个像素大小的功能,但实际上我们将有多层功能图。接下来,我们将该窗口滑过并继续该过程,继续此过程,直到覆盖整个图像。\n", "\n", "池化:最常见的池化形式是“最大池化”,其中我们简单地获取窗口中的最大值,并且该值成为该区域的新值。\n", "\n", "全连接层:每个卷积和池化步骤都是隐藏层。在此之后,我们有一个完全连接的层,然后是输出层。完全连接的层是典型的神经网络(多层感知器)类型的层,与输出层相同。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 注意\n", "本次代码中所需的X.pickle和y.pickle为上一篇的输出,路径请根据自己的情况更改!\n", "\n", "此篇中文为译者根据原文整理得到,可能有不当之处,可以点击此处查看原文。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train on 17462 samples, validate on 7484 samples\n", "Epoch 1/3\n", "17462/17462 [==============================] - 47s 3ms/step - loss: 0.6728 - acc: 0.6019 - val_loss: 0.6317 - val_acc: 0.6463\n", "Epoch 2/3\n", "17462/17462 [==============================] - 41s 2ms/step - loss: 0.6164 - acc: 0.6673 - val_loss: 0.6117 - val_acc: 0.6776\n", "Epoch 3/3\n", "17462/17462 [==============================] - 41s 2ms/step - loss: 0.5690 - acc: 0.7129 - val_loss: 0.5860 - val_acc: 0.6963\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.datasets import cifar10\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten\n", "from tensorflow.keras.layers import Conv2D, MaxPooling2D\n", "\n", "import pickle\n", "\n", "pickle_in = open(\"../datasets/X.pickle\",\"rb\")\n", "X = pickle.load(pickle_in)\n", "\n", "pickle_in = open(\"../datasets/y.pickle\",\"rb\")\n", "y = pickle.load(pickle_in)\n", "\n", "X = X/255.0\n", "\n", "model = Sequential()\n", "\n", "model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Conv2D(256, (3, 3)))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors\n", "\n", "model.add(Dense(64))\n", "\n", "model.add(Dense(1))\n", "model.add(Activation('sigmoid'))\n", "\n", "model.compile(loss='binary_crossentropy',\n", " optimizer='adam',\n", " metrics=['accuracy'])\n", "\n", "model.fit(X, y, batch_size=32, epochs=3, validation_split=0.3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在仅仅三个epoches之后,我们的验证准确率为71%。如果我们继续进行更多的epoches,我们可能会做得更好,但我们应该讨论我们如何知道我们如何做。为了解决这个问题,我们可以使用TensorFlow附带的TensorBoard,它可以帮助您在训练模型时可视化模型。\n", "\n", "我们将在下一个教程中讨论TensorBoard以及对我们模型的各种调整!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 42.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "这是Python,TensorFlow和Keras教程系列的深度学习基础知识的第4部分。\n", "\n", "在这一部分,我们将讨论的是TensorBoard。TensorBoard是一个方便的应用程序,允许您在浏览器中查看模型或模型的各个方面。我们将TensorBoard与Keras一起使用的方式是通过Keras回调。实际上有很多Keras回调,你可以自己制作。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "from tensorflow.keras.callbacks import TensorBoard" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#创建TensorBoard回调对象\n", "NAME = \"Cats-vs-dogs-CNN\"\n", "\n", "tensorboard = TensorBoard(log_dir=\"logs/{}\".format(NAME))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最终,你会希望获得更多的自定义NAME,但现在这样做。因此,这将保存模型的训练数据logs/NAME,然后由TensorBoard读取。\n", "\n", "最后,我们可以通过将它添加到.fit方法中来将此回调添加到我们的模型中,例如:\n", "```python\n", "model.fit(X, y,\n", " batch_size=32,\n", " epochs=3,\n", " validation_split=0.3,\n", " callbacks=[tensorboard])\n", "```\n", "请注意,这callbacks是一个列表。您也可以将其他回调传递到此列表中。我们的模型还没有定义,所以现在让我们把它们放在一起:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 17462 samples, validate on 7484 samples\n", "Epoch 1/3\n", "17462/17462 [==============================] - 44s 3ms/step - loss: 0.6992 - acc: 0.5480 - val_loss: 0.6900 - val_acc: 0.5274\n", "Epoch 2/3\n", "17462/17462 [==============================] - 41s 2ms/step - loss: 0.6754 - acc: 0.5782 - val_loss: 0.6685 - val_acc: 0.5885\n", "Epoch 3/3\n", "17462/17462 [==============================] - 41s 2ms/step - loss: 0.6377 - acc: 0.6483 - val_loss: 0.6217 - val_acc: 0.6625\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.datasets import cifar10\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten\n", "from tensorflow.keras.layers import Conv2D, MaxPooling2D\n", "from tensorflow.keras.callbacks import TensorBoard\n", "# more info on callbakcs: https://keras.io/callbacks/ model saver is cool too.\n", "import pickle\n", "import time\n", "\n", "NAME = \"Cats-vs-dogs-CNN\"\n", "\n", "pickle_in = open(\"../datasets/X.pickle\",\"rb\")\n", "X = pickle.load(pickle_in)\n", "\n", "pickle_in = open(\"../datasets/y.pickle\",\"rb\")\n", "y = pickle.load(pickle_in)\n", "\n", "X = X/255.0\n", "\n", "model = Sequential()\n", "\n", "model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Conv2D(256, (3, 3)))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors\n", "model.add(Dense(64))\n", "\n", "model.add(Dense(1))\n", "model.add(Activation('sigmoid'))\n", "\n", "tensorboard = TensorBoard(log_dir=\"logs/{}\".format(NAME))\n", "\n", "model.compile(loss='binary_crossentropy',\n", " optimizer='adam',\n", " metrics=['accuracy'],\n", " )\n", "\n", "model.fit(X, y,\n", " batch_size=32,\n", " epochs=3,\n", " validation_split=0.3,\n", " callbacks=[tensorboard])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "运行此之后,您应该有一个名为的新目录logs。我们现在可以使用tensorboard从这个目录中可视化初始结果。打开控制台,切换到工作目录,然后键入:tensorboard --logdir=logs/。您应该看到一个通知:TensorBoard 1.10.0 at http://H-PC:6006 (Press CTRL+C to quit)“h-pc”是您机器的名称。打开浏览器并前往此地址。你应该看到类似的东西:\n", "\n", "现在我们可以看到我们的模型随着时间的推移。让我们改变模型中的一些东西。首先,我们从未在密集层中添加激活。另外,让我们尝试整体较小的模型:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 17462 samples, validate on 7484 samples\n", "Epoch 1/10\n", "17462/17462 [==============================] - 11s 604us/step - loss: 0.6033 - acc: 0.6652 - val_loss: 0.5298 - val_acc: 0.7320\n", "Epoch 2/10\n", "17462/17462 [==============================] - 11s 646us/step - loss: 0.4859 - acc: 0.7659 - val_loss: 0.4723 - val_acc: 0.7763\n", "Epoch 3/10\n", "17462/17462 [==============================] - 11s 641us/step - loss: 0.4270 - acc: 0.8045 - val_loss: 0.4603 - val_acc: 0.7803\n", "Epoch 4/10\n", "17462/17462 [==============================] - 12s 699us/step - loss: 0.3675 - acc: 0.8347 - val_loss: 0.4476 - val_acc: 0.7929\n", "Epoch 5/10\n", "17462/17462 [==============================] - 12s 707us/step - loss: 0.3012 - acc: 0.8694 - val_loss: 0.4854 - val_acc: 0.7797\n", "Epoch 6/10\n", "17462/17462 [==============================] - 12s 705us/step - loss: 0.2165 - acc: 0.9118 - val_loss: 0.5450 - val_acc: 0.7865\n", "Epoch 7/10\n", "17462/17462 [==============================] - 12s 712us/step - loss: 0.1332 - acc: 0.9510 - val_loss: 0.6512 - val_acc: 0.7821\n", "Epoch 8/10\n", "17462/17462 [==============================] - 12s 705us/step - loss: 0.0764 - acc: 0.9743 - val_loss: 0.7487 - val_acc: 0.7809\n", "Epoch 9/10\n", "17462/17462 [==============================] - 12s 713us/step - loss: 0.0389 - acc: 0.9887 - val_loss: 0.9041 - val_acc: 0.7743\n", "Epoch 10/10\n", "17462/17462 [==============================] - 12s 708us/step - loss: 0.0287 - acc: 0.9921 - val_loss: 1.0411 - val_acc: 0.7702\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten\n", "from tensorflow.keras.layers import Conv2D, MaxPooling2D\n", "from tensorflow.keras.callbacks import TensorBoard\n", "# more info on callbakcs: https://keras.io/callbacks/ model saver is cool too.\n", "import pickle\n", "import time\n", "\n", "NAME = \"Cats-vs-dogs-64x2-CNN\"\n", "\n", "pickle_in = open(\"../datasets/X.pickle\",\"rb\")\n", "X = pickle.load(pickle_in)\n", "\n", "pickle_in = open(\"../datasets/y.pickle\",\"rb\")\n", "y = pickle.load(pickle_in)\n", "\n", "X = X/255.0\n", "\n", "model = Sequential()\n", "\n", "model.add(Conv2D(64, (3, 3), input_shape=X.shape[1:]))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Conv2D(64, (3, 3)))\n", "model.add(Activation('relu'))\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors\n", "model.add(Dense(64))\n", "model.add(Activation('relu'))\n", "\n", "model.add(Dense(1))\n", "model.add(Activation('sigmoid'))\n", "\n", "tensorboard = TensorBoard(log_dir=\"logs/{}\".format(NAME))\n", "\n", "model.compile(loss='binary_crossentropy',\n", " optimizer='adam',\n", " metrics=['accuracy'],\n", " )\n", "\n", "model.fit(X, y,\n", " batch_size=32,\n", " epochs=10,\n", " validation_split=0.3,\n", " callbacks=[tensorboard])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "除此之外,我还改名为NAME = \"Cats-vs-dogs-64x2-CNN\"。不要忘记这样做,否则你会偶然附加到你以前的型号的日志,它看起来不太好。我们现在检查TensorBoard:\n", "\n", "看起来更好!但是,您可能会立即注意到验证丢失的形状。损失是衡量错误的标准,看起来很明显,在我们的第四个时代之后,事情开始变得糟糕。\n", "\n", "有趣的是,我们的验证准确性仍然持续,但我想它最终会开始下降。更可能的是,第一件遭受的事情确实是你的验证损失。这应该提醒你,你几乎肯定会开始过度适应。这种情况发生的原因是该模型不断尝试减少样本损失。\n", "\n", "在某些时候,模型不是学习关于实际数据的一般事物,而是开始只记忆输入数据。如果你继续这样做,是的,样本中的“准确性”会上升,但你的样本,以及你试图为模型提供的任何新数据可能会表现得很差。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 6_Logistic_Regression.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习100天——第6天:逻辑回归(Linear Regression)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第1步:数据预处理\n", "### 导入库" ] }, { "cell_type": "code", "execution_count": 0, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 导入数据集\n", "这里获取数据集" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "dataset = pd.read_csv('../datasets/Social_Network_Ads.csv')\n", "X = dataset.iloc[:, [2, 3]].values\n", "Y = dataset.iloc[:,4].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 将数据集分成训练集和测试集" ] }, { "cell_type": "code", "execution_count":2, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 特征缩放" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "d:\\python\\python36\\lib\\site-packages\\sklearn\\utils\\validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n", " warnings.warn(msg, DataConversionWarning)\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "sc = StandardScaler()\n", "X_train = sc.fit_transform(X_train)\n", "X_test = sc.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第二步:逻辑回归模型\n", "该项工作的库将会是一个线性模型库,之所以被称为线性是因为逻辑回归是一个线性分类器,这意味着我们在二维空间中,我们两类用户(购买和不购买)将被一条直线分割。然后导入逻辑回归类。下一步我们将创建该类的对象,它将作为我们训练集的分类器。\n", "### 将逻辑回归应用于训练集" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", " verbose=0, warm_start=False)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "classifier = LogisticRegression()\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第3步:预测\n", "### 预测测试集结果" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "y_pred = classifier.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 第4步:评估预测\n", "我们预测了测试集。 现在我们将评估逻辑回归模型是否正确的学习和理解。因此这个混淆矩阵将包含我们模型的正确和错误的预测。\n", "### 生成混淆矩阵" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "cm = confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 可视化" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import ListedColormap\n", "X_set,y_set=X_train,y_train\n", "X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),\n", " np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(),X1.max())\n", "plt.ylim(X2.min(),X2.max())\n", "for i,j in enumerate(np. unique(y_set)):\n", " plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],\n", " c = ListedColormap(('red', 'green'))(i), label=j)\n", "\n", "plt. title(' LOGISTIC(Training set)')\n", "plt. xlabel(' Age')\n", "plt. ylabel(' Estimated Salary')\n", "plt. legend()\n", "plt. show()\n", "\n", "X_set,y_set=X_test,y_test\n", "X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),\n", " np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))\n", "\n", "plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),\n", " alpha = 0.75, cmap = ListedColormap(('red', 'green')))\n", "plt.xlim(X1.min(),X1.max())\n", "plt.ylim(X2.min(),X2.max())\n", "for i,j in enumerate(np. unique(y_set)):\n", " plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],\n", " c = ListedColormap(('red', 'green'))(i), label=j)\n", "\n", "plt. title(' LOGISTIC(Test set)')\n", "plt. xlabel(' Age')\n", "plt. ylabel(' Estimated Salary')\n", "plt. legend()\n", "plt. show()" ] } ], "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.6.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: Code/Day 6_Logistic_Regression.md ================================================

### 数据集 | 社交网络

该数据集包含了社交网络中用户的信息。这些信息涉及用户ID,性别,年龄以及预估薪资。一家汽车公司刚刚推出了他们新型的豪华SUV,我们尝试预测哪些用户会购买这种全新SUV。并且在最后一列用来表示用户是否购买。我们将建立一种模型来预测用户是否购买这种SUV,该模型基于两个变量,分别是年龄和预计薪资。因此我们的特征矩阵将是这两列。我们尝试寻找用户年龄与预估薪资之间的某种相关性,以及他是否购买SUV的决定。 ### 步骤1 | 数据预处理 #### 导入库 ```python import numpy as np import matplotlib.pyplot as plt import pandas as pd ``` #### 导入数据集 [这里](https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/datasets/Social_Network_Ads.csv)获取数据集 ```python dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values Y = dataset.iloc[:,4].values ``` #### 将数据集分成训练集和测试集 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0) ``` #### 特征缩放 ```python from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` ### 步骤2 | 逻辑回归模型 该项工作的库将会是一个线性模型库,之所以被称为线性是因为逻辑回归是一个线性分类器,这意味着我们在二维空间中,我们两类用户(购买和不购买)将被一条直线分割。然后导入逻辑回归类。下一步我们将创建该类的对象,它将作为我们训练集的分类器。 #### 将逻辑回归应用于训练集 ```python from sklearn.linear_model import LogisticRegression classifier = LogisticRegression() classifier.fit(X_train, y_train) ``` ### 步骤3 | 预测 #### 预测测试集结果 ```python y_pred = classifier.predict(X_test) ``` ### 步骤4 | 评估预测 我们预测了测试集。 现在我们将评估逻辑回归模型是否正确的学习和理解。因此这个混淆矩阵将包含我们模型的正确和错误的预测。 #### 生成混淆矩阵 ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) ``` #### 可视化 ```python from matplotlib.colors import ListedColormap X_set,y_set=X_train,y_train X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01), np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(),X1.max()) plt.ylim(X2.min(),X2.max()) for i,j in enumerate(np. unique(y_set)): plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1], c = ListedColormap(('red', 'green'))(i), label=j) plt. title(' LOGISTIC(Training set)') plt. xlabel(' Age') plt. ylabel(' Estimated Salary') plt. legend() plt. show() X_set,y_set=X_test,y_test X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01), np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(),X1.max()) plt.ylim(X2.min(),X2.max()) for i,j in enumerate(np. unique(y_set)): plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1], c = ListedColormap(('red', 'green'))(i), label=j) plt. title(' LOGISTIC(Test set)') plt. xlabel(' Age') plt. ylabel(' Estimated Salary') plt. legend() plt. show() ``` ![](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/LR_training.png?raw=true) ![](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/LR_test.png?raw=true) ================================================ FILE: Code/Day 6_Logistic_Regression.py ================================================ # Importing the Libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset dataset = pd.read_csv('../datasets/Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Fitting Logistic Regression to the Training set from sklearn.linear_model import LogisticRegression classifier = LogisticRegression() classifier.fit(X_train, y_train) # Predicting the Test set results y_pred = classifier.predict(X_test) # Making the Confusion Matrix from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report cm = confusion_matrix(y_test, y_pred) print(cm) # print confusion_matrix print(classification_report(y_test, y_pred)) # print classification report #Visualization from matplotlib.colors import ListedColormap X_set,y_set=X_train,y_train X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01), np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(),X1.max()) plt.ylim(X2.min(),X2.max()) for i,j in enumerate(np. unique(y_set)): plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1], c = ListedColormap(('red', 'green'))(i), label=j) plt. title(' LOGISTIC(Training set)') plt. xlabel(' Age') plt. ylabel(' Estimated Salary') plt. legend() plt. show() X_set,y_set=X_test,y_test X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01), np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01)) plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) plt.xlim(X1.min(),X1.max()) plt.ylim(X2.min(),X2.max()) for i,j in enumerate(np. unique(y_set)): plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1], c = ListedColormap(('red', 'green'))(i), label=j) plt. title(' LOGISTIC(Test set)') plt. xlabel(' Age') plt. ylabel(' Estimated Salary') plt. legend() plt. show() ================================================ FILE: Code/KafkaProducer.py ================================================ #!/usr/bin/python from kafka import KafkaProducer kafkaHosts=["kafka01.paas.longfor.sit:9092" ,"kafka02.paas.longfor.sit:9092" ,"kafka03.paas.longfor.sit:9092"] producer = KafkaProducer(bootstrap_servers=kafkaHosts); for _ in range(20): producer.send("testapplog_plm-prototype",b"Hello....") producer.flush(); ================================================ FILE: Code/TestKafka.py ================================================ #!/usr/bin/python from kafka import KafkaConsumer; kafkaHosts=["kafka01.paas.longfor.sit:9092" ,"kafka02.paas.longfor.sit:9092" ,"kafka03.paas.longfor.sit:9092"] ''' earliest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 latest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 none topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常 ''' consumer = KafkaConsumer( bootstrap_servers=kafkaHosts,group_id='mdf_group',auto_offset_reset='latest'); consumer.subscribe("testapplog_plm-prototype"); for msg in consumer: print(msg.value) ================================================ FILE: Code/my/Data_age_salary.csv ================================================ Age,Salary 44,72000 27,48000 30,54000 38,61000 40,78000 35,58000 35,52000 48,79000 50,83000 37,67000 ================================================ FILE: Code/my/LinerTest.py ================================================ import pandas as pd import numpy as np import matplotlib.pyplot as plt dataset = pd.read_csv('Data_age_salary.csv'); dataset.iloc[:1] ================================================ FILE: FAQ.MD ================================================ # 常见问题解答 欢迎到Issues提问 ### 1. “拆分数据”和“特征缩放”的顺序 可以先“拆分数据”,再“特征缩放”,但需要使用训练集的fit参数,去transform测试集,以保证参数相同。 详见[issue#41](https://github.com/MachineLearning100/100-Days-Of-ML-Code/issues/41)。 ### 2. 3Blue1Brown视频 原作中提到的YouTube视频,在B站有[官方中文版](https://space.bilibili.com/88461692/#/),README的链接也是到B站。 感谢网友在[issue#45](https://github.com/MachineLearning100/100-Days-Of-ML-Code/issues/45)的反馈。 ### 3. Deep Learning basics with Python, TensorFlow and Keras [文字版](https://pythonprogramming.net/introduction-deep-learning-python-tensorflow-keras/)的中文版见第39天到第42天。 详见[issue#52](https://github.com/MachineLearning100/100-Days-Of-ML-Code/issues/52)。 ### 4.《Python数据科学手册》 **[高清中文版pdf](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E6%89%8B%E5%86%8C.zip)**,[Jupyter notebooks](https://github.com/jakevdp/PythonDataScienceHandbook)。
仅作为个人学习,不能用于商业用途。 ### 5. 微信群 见[issue#59](https://github.com/MachineLearning100/100-Days-Of-ML-Code/issues/59) ### 6. 常用工具推荐 见[issue#60](https://github.com/MLEveryday/100-Days-Of-ML-Code/issues/60) ### 7. sklearn版本 sklearn工具包0.19和0.20版本,cross_validation在0.20版本是将被移除的并转移到model_selection包下。要排除这些问题,注意平时运行时的出现warning即可。 见[issue63](https://github.com/MLEveryday/100-Days-Of-ML-Code/issues/63)。 ### 8. Python版本 建议使用Python3。使用Python2.7运行示例代码时可能有问题,例如:线性回归如下代码中“1/4”,在Python2.7中1/4=0,可以改成“1.0/4”或者“0.25”。 ```python X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0) ``` ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2018 MachineLearning100 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Other Docs/README.md ================================================ 演示图片 ================================================ FILE: Other Docs/速查手册/README.md ================================================ # 14张速查表,带你玩转 Python 数据科学 译自 DataCamp 的速查表,有兴趣的朋友可以在这里查看[英文原版](https://www.datacamp.com/community/data-science-cheatsheets)。 欢迎扫描二维码关注我的 **呆鸟的Python数据分析** 公众号,虽然现在内容还比较少,但我会不断增加的。 ![呆鸟的Python数据分析](https://upload-images.jianshu.io/upload_images/3240514-6a4349fff3b8b019.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 一、[Python 基础系列](https://www.jianshu.com/p/4574d95755db) * [Python数据科学速查表 - Python 基础](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Python%20基础.pdf) ![Python数据科学速查表 - Python 基础](https://upload-images.jianshu.io/upload_images/3240514-a4268e27432411b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - 导入数据](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20导入数据.pdf) ![Python数据科学速查表 - 导入数据](https://upload-images.jianshu.io/upload_images/3240514-d2b38f138e127333.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Jupyter Notebook](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20Jupyter%20Notebook.pdf) ![Python数据科学速查表 - Jupyter Notebook](https://upload-images.jianshu.io/upload_images/3240514-111052b862105515.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 二、[数据处理系列(Numpy、Pandas 及 SciPy)](https://www.jianshu.com/p/8d51642dfa26) * [Python数据科学速查表 - Numpy 基础](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Numpy%20基础.pdf) ![Python数据科学速查表 - Numpy 基础](https://upload-images.jianshu.io/upload_images/3240514-811ca5b168b84a75.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Pandas 基础](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Pandas%20基础.pdf) ![Python数据科学速查表 - Pandas 基础](https://upload-images.jianshu.io/upload_images/3240514-0711ea1cb1d1fcee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Pandas 进阶](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Pandas%20进阶.pdf) ![Python数据科学速查表 - Pandas 进阶](https://upload-images.jianshu.io/upload_images/3240514-475cfa9174303f60.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - SciPy](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20SciPy.pdf) ![Python数据科学速查表 - SciPy](https://upload-images.jianshu.io/upload_images/3240514-fc9fa2b69a820041.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 三、[可视化系列(Matplotlib、Bokeh、Seaborn)](https://www.jianshu.com/p/7e186d43d7f1) * [Python数据科学速查表 - Matplotlib](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Matplotlib%20绘图.pdf) ![Python数据科学速查表 - Matplotlib](https://upload-images.jianshu.io/upload_images/3240514-9c57bcf33113cf98.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Bokeh](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Bokeh.pdf) ![Python数据科学速查表 - Bokeh](https://upload-images.jianshu.io/upload_images/3240514-d87990f4a3f7f0ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Seaborn](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20Seaborn.pdf) ![Python数据科学速查表 - Seaborn](https://upload-images.jianshu.io/upload_images/3240514-1c2f56b96f841421.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 四、[机器学习系列(Keras、Scikit-learn)](https://www.jianshu.com/p/cba49ff5fc97) * [Python数据科学速查表 - Keras](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python数据科学速查表%20-%20Keras.pdf) ![Python数据科学速查表 - Keras](https://upload-images.jianshu.io/upload_images/3240514-ea9657c97b5e0d19.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Scikit-learn](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20Scikit-Learn.pdf) ![Python数据科学速查表 - Scikit-learn](https://upload-images.jianshu.io/upload_images/3240514-b8cbecb3a9194b71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 五、[PySpark系列(SQL与RDD)](https://www.jianshu.com/p/7dea578c56d8) * [Python数据科学速查表 - Spark SQL 基础](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20Spark%20SQL%20%E5%9F%BA%E7%A1%80.pdf) ![pyspark.png](https://upload-images.jianshu.io/upload_images/3240514-32909e63b67c0837.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * [Python数据科学速查表 - Spark RDD 基础](https://github.com/jaystone776/python-data-science-cheatsheet/blob/master/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E9%80%9F%E6%9F%A5%E8%A1%A8%20-%20Spark%20RDD%20%E5%9F%BA%E7%A1%80.pdf) ![RDD.png](https://upload-images.jianshu.io/upload_images/3240514-43308e4ca89d8699.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果喜欢本文,敬请关注我的简书专题 **[呆鸟的Python数据分析](https://www.jianshu.com/c/38980843c0f2)** 感谢**天善智能**的**Python爱好者社区**公众号一直以来对我的支持,这里也大力推荐,是我学习入门 Python 数据分析入门的引路者,欢迎关注! ![Python爱好者社区](https://upload-images.jianshu.io/upload_images/3240514-29c87337342b0904.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ================================================ FILE: README.md ================================================ # 机器学习100天 英文原版请移步[Avik-Jain](https://github.com/Avik-Jain/100-Days-Of-ML-Code)。数据在[这里](https://github.com/MachineLearning100/100-Days-Of-ML-Code/tree/master/datasets)。 翻译前请先阅读[规范](Translation%20specification.MD)。常见问题解答见[FAQ](FAQ.MD)。 # 目录 - 有监督学习 - [数据预处理](#数据预处理--第1天) - [简单线性回归](#简单线性回归--第2天) - [多元线性回归](#多元线性回归--第3天) - [逻辑回归](#逻辑回归--第4天) - [k近邻法(k-NN)](#k近邻法k-nn--第7天) - [支持向量机(SVM)](#支持向量机svm--第12天) - [决策树](#决策树--第23天) - [随机森林](#随机森林--第33天) - 无监督学习 - [K-均值聚类](#k-均值聚类--第43天) - [层次聚类](#层次聚类--第54天) ## 数据预处理 | 第1天 [数据预处理实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%201_Data_Preprocessing.md)

## 简单线性回归 | 第2天 [简单线性回归实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%202_Simple_Linear_Regression.md)

## 多元线性回归 | 第3天 [多元线性回归实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%203_Multiple_Linear_Regression.md)

## 逻辑回归 | 第4天

## 逻辑回归 | 第5天 今天我深入研究了逻辑回归到底是什么,以及它背后的数学是什么。学习了如何计算代价函数,以及如何使用梯度下降法来将代价函数降低到最小。
由于时间关系,我将隔天发布信息图。如果有人在机器学习领域有一定经验,并愿意帮我编写代码文档,也了解github的Markdown语法,请在领英联系我。 ## 逻辑回归 | 第6天 [逻辑回归实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%206_Logistic_Regression.md) ## K近邻法(k-NN) | 第7天

## 逻辑回归背后的数学 | 第8天 为了使我对逻辑回归的见解更加清晰,我在网上搜索了一些资源或文章,然后我就发现了Saishruthi Swaminathan的这篇文章
它给出了逻辑回归的详细描述。请务必看一看。 ## 支持向量机(SVM) | 第9天 直观了解SVM是什么以及如何使用它来解决分类问题。 ## 支持向量机和K近邻法 | 第10天 了解更多关于SVM如何工作和实现knn算法的知识。 ## K近邻法(k-NN) | 第11天 [K近邻法(k-NN)实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2011_K-NN.md) ## 支持向量机(SVM) | 第12天

## 支持向量机(SVM) | 第13天 [SVM实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2013_SVM.md) ## 支持向量机(SVM)的实现 | 第14天 今天我在线性相关数据上实现了SVM。使用Scikit-Learn库。在scikit-learn中我们有SVC分类器,我们用它来完成这个任务。将在下一次实现时使用kernel-trick。Python代码见[此处](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2013_SVM.py),Jupyter notebook见[此处](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2013_SVM.ipynb)。 ## 朴素贝叶斯分类器(Naive Bayes Classifier)和黑盒机器学习(Black Box Machine Learning) | 第15天 学习不同类型的朴素贝叶斯分类器同时开始Bloomberg的课程。课程列表中的第一个是黑盒机器学习。它给出了预测函数,特征提取,学习算法,性能评估,交叉验证,样本偏差,非平稳性,过度拟合和超参数调整的整体观点。 ## 通过内核技巧实现支持向量机 | 第16天 使用Scikit-Learn库实现了SVM算法以及内核函数,该函数将我们的数据点映射到更高维度以找到最佳超平面。 ## 在Coursera开始深度学习的专业课程 | 第17天 在1天内完成第1周和第2周内容以及学习课程中的逻辑回归神经网络。 ## 继续Coursera上的深度学习专业课程 | 第18天 完成课程1。用Python自己实现一个神经网络。 ## 学习问题和Yaser Abu-Mostafa教授 | 第19天 开始Yaser Abu-Mostafa教授的Caltech机器学习课程-CS156中的课程1。这基本上是对即将到来的课程的一种介绍。他也介绍了感知算法。 ## 深度学习专业课程2 | 第20天 完成改进深度神经网络第1周内容:参数调整,正则化和优化。 ## 网页搜罗 | 第21天 观看了一些关于如何使用Beautiful Soup进行网络爬虫的教程,以便收集用于构建模型的数据。 ## 学习还可行吗? | 第22天 完成Yaser Abu-Mostafa教授的Caltech机器学习课程-CS156中的课程2。学习Hoeffding不等式。 ## 决策树 | 第23天

## 统计学习理论的介绍 | 第24天 Bloomberg ML课程的第3课介绍了一些核心概念,如输入空间,动作空间,结果空间,预测函数,损失函数和假设空间。 ## 决策树 | 第25天 [决策树实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2025_Decision_Tree.md) ## 跳到复习线性代数 | 第26天 发现YouTube一个神奇的频道[3Blue1Brown](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw),它有一个播放列表《线性代数的本质》。看完了4个视频,包括了向量,线性组合,跨度,基向量,线性变换和矩阵乘法。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=9450)。 ## 跳到复习线性代数 | 第27天 继续观看了4个视频,内容包括三维变换、行列式、逆矩阵、列空间、零空间和非方矩阵。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=9450)。 ## 跳到复习线性代数 | 第28天 继续观看了3个视频,内容包括点积和叉积。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=9450)。 ## 跳到复习线性代数 | 第29天 观看了剩余的视频12到14,内容包括特征向量和特征值,以及抽象向量空间。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=9450)。 ## 微积分的本质 | 第30天 完成上一播放列表后,YouTube推荐了新内容《微积分的本质》,今天看完了其中的3个视频,包括导数、链式法则、乘积法则和指数导数。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=13407)。 ## 微积分的本质 | 第31天 观看了2个视频,内容包括隐分化与极限。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=13407)。 ## 微积分的本质 | 第32天 观看了剩余的4个视频,内容包括积分与高阶导数。 B站播放列表在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=13407)。 ## 随机森林 | 第33天

## 随机森林 | 第34天 [随机森林实现](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2034_Random_Forests.md) ## 什么是神经网络? | 深度学习,第1章 | 第 35天 Youtube频道3Blue1Brown中有精彩的视频介绍神经网络。这个视频提供了很好的解释,并使用手写数字数据集演示基本概念。 B站视频在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=26587)。 ## 梯度下降法,神经网络如何学习 | 深度学习,第2章 | 第36天 Youtube频道3Blue1Brown关于神经网络的第2部分,这个视频用有趣的方式解释了梯度下降法。推荐必须观看169. B站视频在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=26587)。 ## 反向传播法究竟做什么? | 深度学习,第3章 | 第37天 Youtube频道3Blue1Brown关于神经网络的第3部分,这个视频主要介绍了偏导数和反向传播法。 B站视频在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=26587)。 ## 反向传播法演算 | 深度学习,第4章 | 第38天 Youtube频道3Blue1Brown关于神经网络的第3部分,这个视频主要介绍了偏导数和反向传播法。 B站视频在[这里](https://space.bilibili.com/88461692/#/channel/detail?cid=26587)。 ## 第1部分 | 深度学习基础Python,TensorFlow和Keras | 第39天 视频地址在[这里](https://www.youtube.com/watch?v=wQ8BIBpya2k&t=19s&index=2&list=PLQVvvaa0QuDfhTox0AjmQ6tvTgMBZBEXN)。
中文文字版[notebook](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2039.ipynb)。 ## 第2部分 | 深度学习基础Python,TensorFlow和Keras | 第40天 视频地址在[这里](https://www.youtube.com/watch?v=wQ8BIBpya2k&t=19s&index=2&list=PLQVvvaa0QuDfhTox0AjmQ6tvTgMBZBEXN)。
中文文字版[notebook](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2040.ipynb)。 ## 第3部分 | 深度学习基础Python,TensorFlow和Keras | 第41天 视频地址在[这里](https://www.youtube.com/watch?v=wQ8BIBpya2k&t=19s&index=2&list=PLQVvvaa0QuDfhTox0AjmQ6tvTgMBZBEXN)。
中文文字版[notebook](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2041.ipynb)。 ## 第4部分 | 深度学习基础Python,TensorFlow和Keras | 第42天 视频地址在[这里](https://www.youtube.com/watch?v=wQ8BIBpya2k&t=19s&index=2&list=PLQVvvaa0QuDfhTox0AjmQ6tvTgMBZBEXN)。
中文文字版[notebook](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Code/Day%2042.ipynb)。 ## K-均值聚类 | 第43天 转到无监督学习,并研究了聚类。可在[作者网站](http://www.avikjain.me/)查询。发现一个奇妙的[动画](http://shabal.in/visuals/kmeans/6.html)有助于理解K-均值聚类。

## K-均值聚类 | 第44天 实现(待添加代码) ## 深入研究 | NUMPY | 第45天 得到JK VanderPlas写的书《Python数据科学手册(Python Data Science HandBook)》,Jupyter notebooks在[这里](https://github.com/jakevdp/PythonDataScienceHandbook)。
**[高清中文版pdf](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/Python%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E6%89%8B%E5%86%8C.zip)**
第2章:NumPy介绍,包括数据类型、数组和数组计算。
代码如下:
[2 NumPy入门](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.00-Introduction-to-NumPy.ipynb)
[2.1 理解Python中的数据类型](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.01-Understanding-Data-Types.ipynb)
[2.2 NumPy数组基础](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.02-The-Basics-Of-NumPy-Arrays.ipynb)
[2.3 NumPy数组的计算:通用函数](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.03-Computation-on-arrays-ufuncs.ipynb) ## 深入研究 | NUMPY | 第46天 第2章: 聚合, 比较运算符和广播。
代码如下:
[2.4 聚合:最小值、最大值和其他值](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.04-Computation-on-arrays-aggregates.ipynb)
[2.5 数组的计算:广播](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.05-Computation-on-arrays-broadcasting.ipynb)
[2.6 比较、掩码和布尔运算](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.06-Boolean-Arrays-and-Masks.ipynb) ## 深入研究 | NUMPY | 第47天 第2章: 花哨的索引,数组排序,结构化数据。
代码如下:
[2.7 花哨的索引](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.07-Fancy-Indexing.ipynb)
[2.8 数组的排序](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.08-Sorting.ipynb)
[2.9 结构化数据:NumPy的结构化数组](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/02.09-
Structured-Data-NumPy.ipynb) ## 深入研究 | PANDAS | 第48天 第3章:Pandas数据处理
包含Pandas对象,数据取值与选择,数值运算方法,处理缺失值,层级索引,合并数据集。
代码如下:
[3 Pandas数据处理](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.00-Introduction-to-Pandas.ipynb)
[3.1 Pandas对象简介](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.01-Introducing-Pandas-Objects.ipynb)
[3.2 数据取值与选择](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.02-Data-Indexing-and-Selection.ipynb)
[3.3 Pandas数值运算方法](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.03-Operations-in-Pandas.ipynb)
[3.4 处理缺失值](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.04-Missing-Values.ipynb)
[3.5 层级索引](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.05-Hierarchical-Indexing.ipynb)
[3.6 合并数据集:ConCat和Append方法](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.06-Concat-And-Append.ipynb) ## 深入研究 | PANDAS | 第49天 第3章:完成剩余内容-合并与连接,累计与分组,数据透视表。
代码如下:
[3.7 合并数据集:合并与连接](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.07-Merge-and-Join.ipynb)
[3.8 累计与分组](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.08-Aggregation-and-Grouping.ipynb)
[3.9 数据透视表](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.09-Pivot-Tables.ipynb) ## 深入研究 | PANDAS | 第50天 第3章:向量化字符串操作,处理时间序列。
代码如下:
[3.10 向量化字符串操作](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.10-Working-With-Strings.ipynb)
[3.11 处理时间序列](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.11-Working-with-Time-Series.ipynb)
[3.12 高性能Pandas:eval()与query()](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/03.12-Performance-Eval-and-Query.ipynb) ## 深入研究 | MATPLOTLIB | 第51天 第4章:Matplotlib数据可视化
学习简易线形图, 简易散点图,密度图与等高线图.
代码如下:
[4 Matplotlib数据可视化](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.00-Introduction-To-Matplotlib.ipynb)
[4.1 简易线形图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.01-Simple-Line-Plots.ipynb)
[4.2 简易散点图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.02-Simple-Scatter-Plots.ipynb)
[4.3 可视化异常处理](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.03-Errorbars.ipynb)
[4.4 密度图与等高线图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.04-Density-and-Contour-Plots.ipynb) ## 深入研究 | MATPLOTLIB | 第52天 第4章:Matplotlib数据可视化
学习直方图,配置图例,配置颜色条,多子图。
代码如下:
[4.5 直方图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.05-Histograms-and-Binnings.ipynb)
[4.6 配置图例](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.06-Customizing-Legends.ipynb)
[4.7 配置颜色条](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.07-Customizing-Colorbars.ipynb)
[4.8 多子图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.08-Multiple-Subplots.ipynb)
[4.9 文字与注释](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.09-Text-and-Annotation.ipynb) ## 深入研究 | MATPLOTLIB | 第53天 第4章:Matplotlib数据可视化
学习三维绘图。
[4.12 画三维图](https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.12-Three-Dimensional-Plotting.ipynb) ## 层次聚类 | 第54天 [动画演示](https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/%E5%B1%82%E6%AC%A1%E8%81%9A%E7%B1%BB.gif)

================================================ FILE: Translation specification.MD ================================================ ## 翻译规范`v20180809` ### 交付物 >- 图片(.jpg),质量选择最高,源文件自己保留好,文件命名`Day xxx.jpg` >- 代码,含md、py、notebook等,要求调试通过,数据引用datasets文件夹`../datasets/xxxx.csv`,文件命名`Day xxx_xxxx_xxxx.md` ### 忽略区域 >- 页眉(`#100DaysOfMLCode`+`Day XXX`+`@Avik Jain`) >- 页脚(`github`+`Follow`) >- 图表坐标轴 >- 代码,如库、类、方法名称等 ### 强制区域 >- 图表说明文字 ### 格式 >- 字体颜色、间距等格式和原文保持一致。 ### 数字 >- 需要用到数字编号的,一律使用阿拉伯数字`1234567890`,如:`步骤1`,`步骤2`等 >- 文字内容中,从中文习惯出发,使用`二维`、`三维`、`两个`等 ### 符号 >- 编号等使用英文符号,如`1.`,`2.`等 >- 除特殊要求外,其他都用中文符号,如`,`,`。`,`:`,`?`等 ### 保留英文场景 >- 标题或正文中,如果英文认知度更高,更准确,则翻译成`中(英)`。注意使用了**英文括号**。 ### 词典 按字母升序排列。 |English|中文| |---|---| |dependent variable|因变量| |independent variable|自变量| ================================================ FILE: datasets/50_Startups.csv ================================================ R&D Spend,Administration,Marketing Spend,State,Profit 165349.2,136897.8,471784.1,New York,192261.83 162597.7,151377.59,443898.53,California,191792.06 153441.51,101145.55,407934.54,Florida,191050.39 144372.41,118671.85,383199.62,New York,182901.99 142107.34,91391.77,366168.42,Florida,166187.94 131876.9,99814.71,362861.36,New York,156991.12 134615.46,147198.87,127716.82,California,156122.51 130298.13,145530.06,323876.68,Florida,155752.6 120542.52,148718.95,311613.29,New York,152211.77 123334.88,108679.17,304981.62,California,149759.96 101913.08,110594.11,229160.95,Florida,146121.95 100671.96,91790.61,249744.55,California,144259.4 93863.75,127320.38,249839.44,Florida,141585.52 91992.39,135495.07,252664.93,California,134307.35 119943.24,156547.42,256512.92,Florida,132602.65 114523.61,122616.84,261776.23,New York,129917.04 78013.11,121597.55,264346.06,California,126992.93 94657.16,145077.58,282574.31,New York,125370.37 91749.16,114175.79,294919.57,Florida,124266.9 86419.7,153514.11,0,New York,122776.86 76253.86,113867.3,298664.47,California,118474.03 78389.47,153773.43,299737.29,New York,111313.02 73994.56,122782.75,303319.26,Florida,110352.25 67532.53,105751.03,304768.73,Florida,108733.99 77044.01,99281.34,140574.81,New York,108552.04 64664.71,139553.16,137962.62,California,107404.34 75328.87,144135.98,134050.07,Florida,105733.54 72107.6,127864.55,353183.81,New York,105008.31 66051.52,182645.56,118148.2,Florida,103282.38 65605.48,153032.06,107138.38,New York,101004.64 61994.48,115641.28,91131.24,Florida,99937.59 61136.38,152701.92,88218.23,New York,97483.56 63408.86,129219.61,46085.25,California,97427.84 55493.95,103057.49,214634.81,Florida,96778.92 46426.07,157693.92,210797.67,California,96712.8 46014.02,85047.44,205517.64,New York,96479.51 28663.76,127056.21,201126.82,Florida,90708.19 44069.95,51283.14,197029.42,California,89949.14 20229.59,65947.93,185265.1,New York,81229.06 38558.51,82982.09,174999.3,California,81005.76 28754.33,118546.05,172795.67,California,78239.91 27892.92,84710.77,164470.71,Florida,77798.83 23640.93,96189.63,148001.11,California,71498.49 15505.73,127382.3,35534.17,New York,69758.98 22177.74,154806.14,28334.72,California,65200.33 1000.23,124153.04,1903.93,New York,64926.08 1315.46,115816.21,297114.46,Florida,49490.75 0,135426.92,0,California,42559.73 542.05,51743.15,0,New York,35673.41 0,116983.8,45173.06,California,14681.4 ================================================ FILE: datasets/Data.csv ================================================ Country,Age,Salary,Purchased France,44,72000,No Spain,27,48000,Yes Germany,30,54000,No Spain,38,61000,No Germany,40,,Yes France,35,58000,Yes Spain,,52000,No France,48,79000,Yes Germany,50,83000,No France,37,67000,Yes ================================================ FILE: datasets/Social_Network_Ads.csv ================================================ User ID,Gender,Age,EstimatedSalary,Purchased 15624510,Male,19,19000,0 15810944,Male,35,20000,0 15668575,Female,26,43000,0 15603246,Female,27,57000,0 15804002,Male,19,76000,0 15728773,Male,27,58000,0 15598044,Female,27,84000,0 15694829,Female,32,150000,1 15600575,Male,25,33000,0 15727311,Female,35,65000,0 15570769,Female,26,80000,0 15606274,Female,26,52000,0 15746139,Male,20,86000,0 15704987,Male,32,18000,0 15628972,Male,18,82000,0 15697686,Male,29,80000,0 15733883,Male,47,25000,1 15617482,Male,45,26000,1 15704583,Male,46,28000,1 15621083,Female,48,29000,1 15649487,Male,45,22000,1 15736760,Female,47,49000,1 15714658,Male,48,41000,1 15599081,Female,45,22000,1 15705113,Male,46,23000,1 15631159,Male,47,20000,1 15792818,Male,49,28000,1 15633531,Female,47,30000,1 15744529,Male,29,43000,0 15669656,Male,31,18000,0 15581198,Male,31,74000,0 15729054,Female,27,137000,1 15573452,Female,21,16000,0 15776733,Female,28,44000,0 15724858,Male,27,90000,0 15713144,Male,35,27000,0 15690188,Female,33,28000,0 15689425,Male,30,49000,0 15671766,Female,26,72000,0 15782806,Female,27,31000,0 15764419,Female,27,17000,0 15591915,Female,33,51000,0 15772798,Male,35,108000,0 15792008,Male,30,15000,0 15715541,Female,28,84000,0 15639277,Male,23,20000,0 15798850,Male,25,79000,0 15776348,Female,27,54000,0 15727696,Male,30,135000,1 15793813,Female,31,89000,0 15694395,Female,24,32000,0 15764195,Female,18,44000,0 15744919,Female,29,83000,0 15671655,Female,35,23000,0 15654901,Female,27,58000,0 15649136,Female,24,55000,0 15775562,Female,23,48000,0 15807481,Male,28,79000,0 15642885,Male,22,18000,0 15789109,Female,32,117000,0 15814004,Male,27,20000,0 15673619,Male,25,87000,0 15595135,Female,23,66000,0 15583681,Male,32,120000,1 15605000,Female,59,83000,0 15718071,Male,24,58000,0 15679760,Male,24,19000,0 15654574,Female,23,82000,0 15577178,Female,22,63000,0 15595324,Female,31,68000,0 15756932,Male,25,80000,0 15726358,Female,24,27000,0 15595228,Female,20,23000,0 15782530,Female,33,113000,0 15592877,Male,32,18000,0 15651983,Male,34,112000,1 15746737,Male,18,52000,0 15774179,Female,22,27000,0 15667265,Female,28,87000,0 15655123,Female,26,17000,0 15595917,Male,30,80000,0 15668385,Male,39,42000,0 15709476,Male,20,49000,0 15711218,Male,35,88000,0 15798659,Female,30,62000,0 15663939,Female,31,118000,1 15694946,Male,24,55000,0 15631912,Female,28,85000,0 15768816,Male,26,81000,0 15682268,Male,35,50000,0 15684801,Male,22,81000,0 15636428,Female,30,116000,0 15809823,Male,26,15000,0 15699284,Female,29,28000,0 15786993,Female,29,83000,0 15709441,Female,35,44000,0 15710257,Female,35,25000,0 15582492,Male,28,123000,1 15575694,Male,35,73000,0 15756820,Female,28,37000,0 15766289,Male,27,88000,0 15593014,Male,28,59000,0 15584545,Female,32,86000,0 15675949,Female,33,149000,1 15672091,Female,19,21000,0 15801658,Male,21,72000,0 15706185,Female,26,35000,0 15789863,Male,27,89000,0 15720943,Male,26,86000,0 15697997,Female,38,80000,0 15665416,Female,39,71000,0 15660200,Female,37,71000,0 15619653,Male,38,61000,0 15773447,Male,37,55000,0 15739160,Male,42,80000,0 15689237,Male,40,57000,0 15679297,Male,35,75000,0 15591433,Male,36,52000,0 15642725,Male,40,59000,0 15701962,Male,41,59000,0 15811613,Female,36,75000,0 15741049,Male,37,72000,0 15724423,Female,40,75000,0 15574305,Male,35,53000,0 15678168,Female,41,51000,0 15697020,Female,39,61000,0 15610801,Male,42,65000,0 15745232,Male,26,32000,0 15722758,Male,30,17000,0 15792102,Female,26,84000,0 15675185,Male,31,58000,0 15801247,Male,33,31000,0 15725660,Male,30,87000,0 15638963,Female,21,68000,0 15800061,Female,28,55000,0 15578006,Male,23,63000,0 15668504,Female,20,82000,0 15687491,Male,30,107000,1 15610403,Female,28,59000,0 15741094,Male,19,25000,0 15807909,Male,19,85000,0 15666141,Female,18,68000,0 15617134,Male,35,59000,0 15783029,Male,30,89000,0 15622833,Female,34,25000,0 15746422,Female,24,89000,0 15750839,Female,27,96000,1 15749130,Female,41,30000,0 15779862,Male,29,61000,0 15767871,Male,20,74000,0 15679651,Female,26,15000,0 15576219,Male,41,45000,0 15699247,Male,31,76000,0 15619087,Female,36,50000,0 15605327,Male,40,47000,0 15610140,Female,31,15000,0 15791174,Male,46,59000,0 15602373,Male,29,75000,0 15762605,Male,26,30000,0 15598840,Female,32,135000,1 15744279,Male,32,100000,1 15670619,Male,25,90000,0 15599533,Female,37,33000,0 15757837,Male,35,38000,0 15697574,Female,33,69000,0 15578738,Female,18,86000,0 15762228,Female,22,55000,0 15614827,Female,35,71000,0 15789815,Male,29,148000,1 15579781,Female,29,47000,0 15587013,Male,21,88000,0 15570932,Male,34,115000,0 15794661,Female,26,118000,0 15581654,Female,34,43000,0 15644296,Female,34,72000,0 15614420,Female,23,28000,0 15609653,Female,35,47000,0 15594577,Male,25,22000,0 15584114,Male,24,23000,0 15673367,Female,31,34000,0 15685576,Male,26,16000,0 15774727,Female,31,71000,0 15694288,Female,32,117000,1 15603319,Male,33,43000,0 15759066,Female,33,60000,0 15814816,Male,31,66000,0 15724402,Female,20,82000,0 15571059,Female,33,41000,0 15674206,Male,35,72000,0 15715160,Male,28,32000,0 15730448,Male,24,84000,0 15662067,Female,19,26000,0 15779581,Male,29,43000,0 15662901,Male,19,70000,0 15689751,Male,28,89000,0 15667742,Male,34,43000,0 15738448,Female,30,79000,0 15680243,Female,20,36000,0 15745083,Male,26,80000,0 15708228,Male,35,22000,0 15628523,Male,35,39000,0 15708196,Male,49,74000,0 15735549,Female,39,134000,1 15809347,Female,41,71000,0 15660866,Female,58,101000,1 15766609,Female,47,47000,0 15654230,Female,55,130000,1 15794566,Female,52,114000,0 15800890,Female,40,142000,1 15697424,Female,46,22000,0 15724536,Female,48,96000,1 15735878,Male,52,150000,1 15707596,Female,59,42000,0 15657163,Male,35,58000,0 15622478,Male,47,43000,0 15779529,Female,60,108000,1 15636023,Male,49,65000,0 15582066,Male,40,78000,0 15666675,Female,46,96000,0 15732987,Male,59,143000,1 15789432,Female,41,80000,0 15663161,Male,35,91000,1 15694879,Male,37,144000,1 15593715,Male,60,102000,1 15575002,Female,35,60000,0 15622171,Male,37,53000,0 15795224,Female,36,126000,1 15685346,Male,56,133000,1 15691808,Female,40,72000,0 15721007,Female,42,80000,1 15794253,Female,35,147000,1 15694453,Male,39,42000,0 15813113,Male,40,107000,1 15614187,Male,49,86000,1 15619407,Female,38,112000,0 15646227,Male,46,79000,1 15660541,Male,40,57000,0 15753874,Female,37,80000,0 15617877,Female,46,82000,0 15772073,Female,53,143000,1 15701537,Male,42,149000,1 15736228,Male,38,59000,0 15780572,Female,50,88000,1 15769596,Female,56,104000,1 15586996,Female,41,72000,0 15722061,Female,51,146000,1 15638003,Female,35,50000,0 15775590,Female,57,122000,1 15730688,Male,41,52000,0 15753102,Female,35,97000,1 15810075,Female,44,39000,0 15723373,Male,37,52000,0 15795298,Female,48,134000,1 15584320,Female,37,146000,1 15724161,Female,50,44000,0 15750056,Female,52,90000,1 15609637,Female,41,72000,0 15794493,Male,40,57000,0 15569641,Female,58,95000,1 15815236,Female,45,131000,1 15811177,Female,35,77000,0 15680587,Male,36,144000,1 15672821,Female,55,125000,1 15767681,Female,35,72000,0 15600379,Male,48,90000,1 15801336,Female,42,108000,1 15721592,Male,40,75000,0 15581282,Male,37,74000,0 15746203,Female,47,144000,1 15583137,Male,40,61000,0 15680752,Female,43,133000,0 15688172,Female,59,76000,1 15791373,Male,60,42000,1 15589449,Male,39,106000,1 15692819,Female,57,26000,1 15727467,Male,57,74000,1 15734312,Male,38,71000,0 15764604,Male,49,88000,1 15613014,Female,52,38000,1 15759684,Female,50,36000,1 15609669,Female,59,88000,1 15685536,Male,35,61000,0 15750447,Male,37,70000,1 15663249,Female,52,21000,1 15638646,Male,48,141000,0 15734161,Female,37,93000,1 15631070,Female,37,62000,0 15761950,Female,48,138000,1 15649668,Male,41,79000,0 15713912,Female,37,78000,1 15586757,Male,39,134000,1 15596522,Male,49,89000,1 15625395,Male,55,39000,1 15760570,Male,37,77000,0 15566689,Female,35,57000,0 15725794,Female,36,63000,0 15673539,Male,42,73000,1 15705298,Female,43,112000,1 15675791,Male,45,79000,0 15747043,Male,46,117000,1 15736397,Female,58,38000,1 15678201,Male,48,74000,1 15720745,Female,37,137000,1 15637593,Male,37,79000,1 15598070,Female,40,60000,0 15787550,Male,42,54000,0 15603942,Female,51,134000,0 15733973,Female,47,113000,1 15596761,Male,36,125000,1 15652400,Female,38,50000,0 15717893,Female,42,70000,0 15622585,Male,39,96000,1 15733964,Female,38,50000,0 15753861,Female,49,141000,1 15747097,Female,39,79000,0 15594762,Female,39,75000,1 15667417,Female,54,104000,1 15684861,Male,35,55000,0 15742204,Male,45,32000,1 15623502,Male,36,60000,0 15774872,Female,52,138000,1 15611191,Female,53,82000,1 15674331,Male,41,52000,0 15619465,Female,48,30000,1 15575247,Female,48,131000,1 15695679,Female,41,60000,0 15713463,Male,41,72000,0 15785170,Female,42,75000,0 15796351,Male,36,118000,1 15639576,Female,47,107000,1 15693264,Male,38,51000,0 15589715,Female,48,119000,1 15769902,Male,42,65000,0 15587177,Male,40,65000,0 15814553,Male,57,60000,1 15601550,Female,36,54000,0 15664907,Male,58,144000,1 15612465,Male,35,79000,0 15810800,Female,38,55000,0 15665760,Male,39,122000,1 15588080,Female,53,104000,1 15776844,Male,35,75000,0 15717560,Female,38,65000,0 15629739,Female,47,51000,1 15729908,Male,47,105000,1 15716781,Female,41,63000,0 15646936,Male,53,72000,1 15768151,Female,54,108000,1 15579212,Male,39,77000,0 15721835,Male,38,61000,0 15800515,Female,38,113000,1 15591279,Male,37,75000,0 15587419,Female,42,90000,1 15750335,Female,37,57000,0 15699619,Male,36,99000,1 15606472,Male,60,34000,1 15778368,Male,54,70000,1 15671387,Female,41,72000,0 15573926,Male,40,71000,1 15709183,Male,42,54000,0 15577514,Male,43,129000,1 15778830,Female,53,34000,1 15768072,Female,47,50000,1 15768293,Female,42,79000,0 15654456,Male,42,104000,1 15807525,Female,59,29000,1 15574372,Female,58,47000,1 15671249,Male,46,88000,1 15779744,Male,38,71000,0 15624755,Female,54,26000,1 15611430,Female,60,46000,1 15774744,Male,60,83000,1 15629885,Female,39,73000,0 15708791,Male,59,130000,1 15793890,Female,37,80000,0 15646091,Female,46,32000,1 15596984,Female,46,74000,0 15800215,Female,42,53000,0 15577806,Male,41,87000,1 15749381,Female,58,23000,1 15683758,Male,42,64000,0 15670615,Male,48,33000,1 15715622,Female,44,139000,1 15707634,Male,49,28000,1 15806901,Female,57,33000,1 15775335,Male,56,60000,1 15724150,Female,49,39000,1 15627220,Male,39,71000,0 15672330,Male,47,34000,1 15668521,Female,48,35000,1 15807837,Male,48,33000,1 15592570,Male,47,23000,1 15748589,Female,45,45000,1 15635893,Male,60,42000,1 15757632,Female,39,59000,0 15691863,Female,46,41000,1 15706071,Male,51,23000,1 15654296,Female,50,20000,1 15755018,Male,36,33000,0 15594041,Female,49,36000,1 ================================================ FILE: datasets/mnist.npz ================================================ [File too large to display: 11.0 MB] ================================================ FILE: datasets/readme.md ================================================ ## 代码中使用的数据 50 50_Startups.csv 10 Data.csv 400 Social_Network_Ads.csv 40966 mnist.npz 28 studentscores.csv 41455 total ================================================ FILE: datasets/studentscores.csv ================================================ Hours,Scores 2.5,21 5.1,47 3.2,27 8.5,75 3.5,30 1.5,20 9.2,88 5.5,60 8.3,81 2.7,25 7.7,85 5.9,62 4.5,41 3.3,42 1.1,17 8.9,95 2.5,30 1.9,24 6.1,67 7.4,69 2.7,30 4.8,54 3.8,35 6.9,76 7.8,86 2.1,93 2.2,93 2.5,93