Showing preview only (523K chars total). Download the full file or copy to clipboard to get everything.
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)
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graphs/Day%207.jpg">
</p>
## 数据集 | 社交网络
<p align="center">
<img src="https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/Other%20Docs/data.PNG">
</p>
## 导入相关库
```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": [
"<matplotlib.figure.Figure at 0x7f62a991e7b8>"
]
},
"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": [
"<matplotlib.figure.Figure at 0x7f62a991c940>"
]
},
"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": [
"<b>完整的项目请前往Github项目<a href=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code\">100-Days-Of-ML-Code</a>查看。有任何的建议或者意见欢迎在issue中提出~</b>"
]
}
],
"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)
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graphs/Day%2012.jpg">
</p>
## 导入库
```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()
```
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/SVM_training%20set.png">
</p>
## 测试集合结果可视化
```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()
```
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Other%20Docs/SVM_test%20set.png">
</p>
================================================
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 (<ipython-input-4-44f585aeb41d>, line 4)",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-4-44f585aeb41d>\"\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": [
"<b>完整的项目请前往Github项目<a href=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code\">100-Days-Of-ML-Code</a>查看。有任何的建议或者意见欢迎在issue中提出~</b>"
]
}
],
"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
================================================
# 数据预处理
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graphs/Day%201.jpg">
</p>
如图所示,通过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": [
"<matplotlib.figure.Figure at 0x7f0c9e6b37f0>"
]
},
"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": [
"<matplotlib.figure.Figure at 0x7f0c9d686e80>"
]
},
"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": [
"<b>完整的项目请前往Github项目<a href=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code\">100-Days-Of-ML-Code</a>查看。有任何的建议或者意见欢迎在issue中提出~</b>"
]
},
{
"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
================================================
# 决策树分类
<p align="center">
<img src="https://github.com/MachineLearning100/100-Days-Of-ML-Code/raw/master/Info-graphs/Day%2023%20-%20Chinese.jpg">
</p>
### 导入需要用到的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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Hours</th>\n <th>Scores</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2.5</td>\n <td>21</td>\n </tr>\n <tr>\n <th>1</th>\n <td>5.1</td>\n <td>47</td>\n </tr>\n <tr>\n <th>2</th>\n <td>3.2</td>\n <td>27</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.5</td>\n <td>75</td>\n </tr>\n <tr>\n <th>4</th>\n <td>3.5</td>\n <td>30</td>\n </tr>\n <tr>\n <th>5</th>\n <td>1.5</td>\n <td>20</td>\n </tr>\n <tr>\n <th>6</th>\n <td>9.2</td>\n <td>88</td>\n </tr>\n <tr>\n <th>7</th>\n <td>5.5</td>\n <td>60</td>\n </tr>\n <tr>\n <th>8</th>\n <td>8.3</td>\n <td>81</td>\n </tr>\n <tr>\n <th>9</th>\n <td>2.7</td>\n <td>25</td>\n </tr>\n <tr>\n <th>10</th>\n <td>7.7</td>\n <td>85</td>\n </tr>\n <tr>\n <th>11</th>\n <td>5.9</td>\n <td>62</td>\n </tr>\n <tr>\n <th>12</th>\n <td>4.5</td>\n <td>41</td>\n </tr>\n <tr>\n <th>13</th>\n <td>3.3</td>\n <td>42</td>\n </tr>\n <tr>\n <th>14</th>\n <td>1.1</td>\n <td>17</td>\n </tr>\n <tr>\n <th>15</th>\n <td>8.9</td>\n <td>95</td>\n </tr>\n <tr>\n <th>16</th>\n <td>2.5</td>\n <td>30</td>\n </tr>\n <tr>\n <th>17</th>\n <td>1.9</td>\n <td>24</td>\n </tr>\n <tr>\n <th>18</th>\n <td>6.1</td>\n <td>67</td>\n </tr>\n <tr>\n <th>19</th>\n <td>7.4</td>\n <td>69</td>\n </tr>\n <tr>\n <th>20</th>\n <td>2.7</td>\n <td>30</td>\n </tr>\n <tr>\n <th>21</th>\n <td>4.8</td>\n <td>54</td>\n </tr>\n <tr>\n <th>22</th>\n <td>3.8</td>\n <td>35</td>\n </tr>\n <tr>\n <th>23</th>\n <td>6.9</td>\n <td>76</td>\n </tr>\n <tr>\n <th>24</th>\n <td>7.8</td>\n <td>86</td>\n </tr>\n <tr>\n <th>25</th>\n <td>2.1</td>\n <td>93</td>\n </tr>\n <tr>\n <th>26</th>\n <td>2.2</td>\n <td>93</td>\n </tr>\n <tr>\n <th>27</th>\n <td>2.5</td>\n <td>93</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"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": "<Figure size 432x288 with 1 Axes>",
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"248.518125pt\" version=\"1.1\" viewBox=\"0 0 368.925 248.518125\" width=\"368.925pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <defs>\r\n <style type=\"text/css\">\r\n*{stroke-linecap:butt;stroke-linejoin:round;}\r\n </style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n <g id=\"patch_1\">\r\n <path d=\"M -0 248.518125 \r\nL 368.925 248.518125 \r\nL 368.925 0 \r\nL -0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n </g>\r\n <g id=\"axes_1\">\r\n <g id=\"patch_2\">\r\n <path d=\"M 26.925 224.64 \r\nL 361.725 224.64 \r\nL 361.725 7.2 \r\nL 26.925 7.2 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n </g>\r\n <g id=\"PathCollection_1\">\r\n <defs>\r\n <path d=\"M 0 3 \r\nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\nC 2.683901 1.55874 3 0.795609 3 0 \r\nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\nC 1.55874 -2.683901 0.795609 -3 0 -3 \r\nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\nC -2.683901 -1.55874 -3 -0.795609 -3 0 \r\nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\nC -1.55874 2.683901 -0.795609 3 0 3 \r\nz\r\n\" id=\"me53af0291c\" style=\"stroke:#ff0000;\"/>\r\n </defs>\r\n <g clip-path=\"url(#p84b38d787b)\">\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"293.900758\" xlink:href=\"#me53af0291c\" y=\"38.744568\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"260.082576\" xlink:href=\"#me53af0291c\" y=\"62.81227\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"42.143182\" xlink:href=\"#me53af0291c\" y=\"204.811711\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"192.446212\" xlink:href=\"#me53af0291c\" y=\"132.608605\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"290.143182\" xlink:href=\"#me53af0291c\" y=\"41.151338\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"124.809848\" xlink:href=\"#me53af0291c\" y=\"144.642456\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"312.688636\" xlink:href=\"#me53af0291c\" y=\"50.778419\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"346.506818\" xlink:href=\"#me53af0291c\" y=\"33.931028\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"230.02197\" xlink:href=\"#me53af0291c\" y=\"84.473201\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"132.325\" xlink:href=\"#me53af0291c\" y=\"173.523698\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"102.264394\" xlink:href=\"#me53af0291c\" y=\"185.557549\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"207.476515\" xlink:href=\"#me53af0291c\" y=\"101.320593\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"102.264394\" xlink:href=\"#me53af0291c\" y=\"173.523698\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"320.203788\" xlink:href=\"#me53af0291c\" y=\"65.21904\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"94.749242\" xlink:href=\"#me53af0291c\" y=\"195.18463\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"181.173485\" xlink:href=\"#me53af0291c\" y=\"115.761214\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"335.234091\" xlink:href=\"#me53af0291c\" y=\"17.083636\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"169.900758\" xlink:href=\"#me53af0291c\" y=\"147.049226\"/>\r\n </g>\r\n </g>\r\n <g id=\"matplotlib.axis_1\">\r\n <g id=\"xtick_1\">\r\n <g id=\"line2d_1\">\r\n <defs>\r\n <path d=\"M 0 0 \r\nL 0 3.5 \r\n\" id=\"mf6b4d2b8f9\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n </defs>\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.385606\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_1\">\r\n <!-- 1 -->\r\n <defs>\r\n <path d=\"M 12.40625 8.296875 \r\nL 28.515625 8.296875 \r\nL 28.515625 63.921875 \r\nL 10.984375 60.40625 \r\nL 10.984375 69.390625 \r\nL 28.421875 72.90625 \r\nL 38.28125 72.90625 \r\nL 38.28125 8.296875 \r\nL 54.390625 8.296875 \r\nL 54.390625 0 \r\nL 12.40625 0 \r\nz\r\n\" id=\"DejaVuSans-49\"/>\r\n </defs>\r\n <g transform=\"translate(35.204356 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-49\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_2\">\r\n <g id=\"line2d_2\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"75.961364\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_2\">\r\n <!-- 2 -->\r\n <defs>\r\n <path d=\"M 19.1875 8.296875 \r\nL 53.609375 8.296875 \r\nL 53.609375 0 \r\nL 7.328125 0 \r\nL 7.328125 8.296875 \r\nQ 12.9375 14.109375 22.625 23.890625 \r\nQ 32.328125 33.6875 34.8125 36.53125 \r\nQ 39.546875 41.84375 41.421875 45.53125 \r\nQ 43.3125 49.21875 43.3125 52.78125 \r\nQ 43.3125 58.59375 39.234375 62.25 \r\nQ 35.15625 65.921875 28.609375 65.921875 \r\nQ 23.96875 65.921875 18.8125 64.3125 \r\nQ 13.671875 62.703125 7.8125 59.421875 \r\nL 7.8125 69.390625 \r\nQ 13.765625 71.78125 18.9375 73 \r\nQ 24.125 74.21875 28.421875 74.21875 \r\nQ 39.75 74.21875 46.484375 68.546875 \r\nQ 53.21875 62.890625 53.21875 53.421875 \r\nQ 53.21875 48.921875 51.53125 44.890625 \r\nQ 49.859375 40.875 45.40625 35.40625 \r\nQ 44.1875 33.984375 37.640625 27.21875 \r\nQ 31.109375 20.453125 19.1875 8.296875 \r\nz\r\n\" id=\"DejaVuSans-50\"/>\r\n </defs>\r\n <g transform=\"translate(72.780114 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-50\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_3\">\r\n <g id=\"line2d_3\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"113.537121\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_3\">\r\n <!-- 3 -->\r\n <defs>\r\n <path d=\"M 40.578125 39.3125 \r\nQ 47.65625 37.796875 51.625 33 \r\nQ 55.609375 28.21875 55.609375 21.1875 \r\nQ 55.609375 10.40625 48.1875 4.484375 \r\nQ 40.765625 -1.421875 27.09375 -1.421875 \r\nQ 22.515625 -1.421875 17.65625 -0.515625 \r\nQ 12.796875 0.390625 7.625 2.203125 \r\nL 7.625 11.71875 \r\nQ 11.71875 9.328125 16.59375 8.109375 \r\nQ 21.484375 6.890625 26.8125 6.890625 \r\nQ 36.078125 6.890625 40.9375 10.546875 \r\nQ 45.796875 14.203125 45.796875 21.1875 \r\nQ 45.796875 27.640625 41.28125 31.265625 \r\nQ 36.765625 34.90625 28.71875 34.90625 \r\nL 20.21875 34.90625 \r\nL 20.21875 43.015625 \r\nL 29.109375 43.015625 \r\nQ 36.375 43.015625 40.234375 45.921875 \r\nQ 44.09375 48.828125 44.09375 54.296875 \r\nQ 44.09375 59.90625 40.109375 62.90625 \r\nQ 36.140625 65.921875 28.71875 65.921875 \r\nQ 24.65625 65.921875 20.015625 65.03125 \r\nQ 15.375 64.15625 9.8125 62.3125 \r\nL 9.8125 71.09375 \r\nQ 15.4375 72.65625 20.34375 73.4375 \r\nQ 25.25 74.21875 29.59375 74.21875 \r\nQ 40.828125 74.21875 47.359375 69.109375 \r\nQ 53.90625 64.015625 53.90625 55.328125 \r\nQ 53.90625 49.265625 50.4375 45.09375 \r\nQ 46.96875 40.921875 40.578125 39.3125 \r\nz\r\n\" id=\"DejaVuSans-51\"/>\r\n </defs>\r\n <g transform=\"translate(110.355871 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-51\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_4\">\r\n <g id=\"line2d_4\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"151.112879\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_4\">\r\n <!-- 4 -->\r\n <defs>\r\n <path d=\"M 37.796875 64.3125 \r\nL 12.890625 25.390625 \r\nL 37.796875 25.390625 \r\nz\r\nM 35.203125 72.90625 \r\nL 47.609375 72.90625 \r\nL 47.609375 25.390625 \r\nL 58.015625 25.390625 \r\nL 58.015625 17.1875 \r\nL 47.609375 17.1875 \r\nL 47.609375 0 \r\nL 37.796875 0 \r\nL 37.796875 17.1875 \r\nL 4.890625 17.1875 \r\nL 4.890625 26.703125 \r\nz\r\n\" id=\"DejaVuSans-52\"/>\r\n </defs>\r\n <g transform=\"translate(147.931629 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-52\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_5\">\r\n <g id=\"line2d_5\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"188.688636\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_5\">\r\n <!-- 5 -->\r\n <defs>\r\n <path d=\"M 10.796875 72.90625 \r\nL 49.515625 72.90625 \r\nL 49.515625 64.59375 \r\nL 19.828125 64.59375 \r\nL 19.828125 46.734375 \r\nQ 21.96875 47.46875 24.109375 47.828125 \r\nQ 26.265625 48.1875 28.421875 48.1875 \r\nQ 40.625 48.1875 47.75 41.5 \r\nQ 54.890625 34.8125 54.890625 23.390625 \r\nQ 54.890625 11.625 47.5625 5.09375 \r\nQ 40.234375 -1.421875 26.90625 -1.421875 \r\nQ 22.3125 -1.421875 17.546875 -0.640625 \r\nQ 12.796875 0.140625 7.71875 1.703125 \r\nL 7.71875 11.625 \r\nQ 12.109375 9.234375 16.796875 8.0625 \r\nQ 21.484375 6.890625 26.703125 6.890625 \r\nQ 35.15625 6.890625 40.078125 11.328125 \r\nQ 45.015625 15.765625 45.015625 23.390625 \r\nQ 45.015625 31 40.078125 35.4375 \r\nQ 35.15625 39.890625 26.703125 39.890625 \r\nQ 22.75 39.890625 18.8125 39.015625 \r\nQ 14.890625 38.140625 10.796875 36.28125 \r\nz\r\n\" id=\"DejaVuSans-53\"/>\r\n </defs>\r\n <g transform=\"translate(185.507386 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-53\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_6\">\r\n <g id=\"line2d_6\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"226.264394\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_6\">\r\n <!-- 6 -->\r\n <defs>\r\n <path d=\"M 33.015625 40.375 \r\nQ 26.375 40.375 22.484375 35.828125 \r\nQ 18.609375 31.296875 18.609375 23.390625 \r\nQ 18.609375 15.53125 22.484375 10.953125 \r\nQ 26.375 6.390625 33.015625 6.390625 \r\nQ 39.65625 6.390625 43.53125 10.953125 \r\nQ 47.40625 15.53125 47.40625 23.390625 \r\nQ 47.40625 31.296875 43.53125 35.828125 \r\nQ 39.65625 40.375 33.015625 40.375 \r\nz\r\nM 52.59375 71.296875 \r\nL 52.59375 62.3125 \r\nQ 48.875 64.0625 45.09375 64.984375 \r\nQ 41.3125 65.921875 37.59375 65.921875 \r\nQ 27.828125 65.921875 22.671875 59.328125 \r\nQ 17.53125 52.734375 16.796875 39.40625 \r\nQ 19.671875 43.65625 24.015625 45.921875 \r\nQ 28.375 48.1875 33.59375 48.1875 \r\nQ 44.578125 48.1875 50.953125 41.515625 \r\nQ 57.328125 34.859375 57.328125 23.390625 \r\nQ 57.328125 12.15625 50.6875 5.359375 \r\nQ 44.046875 -1.421875 33.015625 -1.421875 \r\nQ 20.359375 -1.421875 13.671875 8.265625 \r\nQ 6.984375 17.96875 6.984375 36.375 \r\nQ 6.984375 53.65625 15.1875 63.9375 \r\nQ 23.390625 74.21875 37.203125 74.21875 \r\nQ 40.921875 74.21875 44.703125 73.484375 \r\nQ 48.484375 72.75 52.59375 71.296875 \r\nz\r\n\" id=\"DejaVuSans-54\"/>\r\n </defs>\r\n <g transform=\"translate(223.083144 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-54\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_7\">\r\n <g id=\"line2d_7\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"263.840152\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_7\">\r\n <!-- 7 -->\r\n <defs>\r\n <path d=\"M 8.203125 72.90625 \r\nL 55.078125 72.90625 \r\nL 55.078125 68.703125 \r\nL 28.609375 0 \r\nL 18.3125 0 \r\nL 43.21875 64.59375 \r\nL 8.203125 64.59375 \r\nz\r\n\" id=\"DejaVuSans-55\"/>\r\n </defs>\r\n <g transform=\"translate(260.658902 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-55\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_8\">\r\n <g id=\"line2d_8\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"301.415909\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_8\">\r\n <!-- 8 -->\r\n <defs>\r\n <path d=\"M 31.78125 34.625 \r\nQ 24.75 34.625 20.71875 30.859375 \r\nQ 16.703125 27.09375 16.703125 20.515625 \r\nQ 16.703125 13.921875 20.71875 10.15625 \r\nQ 24.75 6.390625 31.78125 6.390625 \r\nQ 38.8125 6.390625 42.859375 10.171875 \r\nQ 46.921875 13.96875 46.921875 20.515625 \r\nQ 46.921875 27.09375 42.890625 30.859375 \r\nQ 38.875 34.625 31.78125 34.625 \r\nz\r\nM 21.921875 38.8125 \r\nQ 15.578125 40.375 12.03125 44.71875 \r\nQ 8.5 49.078125 8.5 55.328125 \r\nQ 8.5 64.0625 14.71875 69.140625 \r\nQ 20.953125 74.21875 31.78125 74.21875 \r\nQ 42.671875 74.21875 48.875 69.140625 \r\nQ 55.078125 64.0625 55.078125 55.328125 \r\nQ 55.078125 49.078125 51.53125 44.71875 \r\nQ 48 40.375 41.703125 38.8125 \r\nQ 48.828125 37.15625 52.796875 32.3125 \r\nQ 56.78125 27.484375 56.78125 20.515625 \r\nQ 56.78125 9.90625 50.3125 4.234375 \r\nQ 43.84375 -1.421875 31.78125 -1.421875 \r\nQ 19.734375 -1.421875 13.25 4.234375 \r\nQ 6.78125 9.90625 6.78125 20.515625 \r\nQ 6.78125 27.484375 10.78125 32.3125 \r\nQ 14.796875 37.15625 21.921875 38.8125 \r\nz\r\nM 18.3125 54.390625 \r\nQ 18.3125 48.734375 21.84375 45.5625 \r\nQ 25.390625 42.390625 31.78125 42.390625 \r\nQ 38.140625 42.390625 41.71875 45.5625 \r\nQ 45.3125 48.734375 45.3125 54.390625 \r\nQ 45.3125 60.0625 41.71875 63.234375 \r\nQ 38.140625 66.40625 31.78125 66.40625 \r\nQ 25.390625 66.40625 21.84375 63.234375 \r\nQ 18.3125 60.0625 18.3125 54.390625 \r\nz\r\n\" id=\"DejaVuSans-56\"/>\r\n </defs>\r\n <g transform=\"translate(298.234659 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-56\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_9\">\r\n <g id=\"line2d_9\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"338.991667\" xlink:href=\"#mf6b4d2b8f9\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_9\">\r\n <!-- 9 -->\r\n <defs>\r\n <path d=\"M 10.984375 1.515625 \r\nL 10.984375 10.5 \r\nQ 14.703125 8.734375 18.5 7.8125 \r\nQ 22.3125 6.890625 25.984375 6.890625 \r\nQ 35.75 6.890625 40.890625 13.453125 \r\nQ 46.046875 20.015625 46.78125 33.40625 \r\nQ 43.953125 29.203125 39.59375 26.953125 \r\nQ 35.25 24.703125 29.984375 24.703125 \r\nQ 19.046875 24.703125 12.671875 31.3125 \r\nQ 6.296875 37.9375 6.296875 49.421875 \r\nQ 6.296875 60.640625 12.9375 67.421875 \r\nQ 19.578125 74.21875 30.609375 74.21875 \r\nQ 43.265625 74.21875 49.921875 64.515625 \r\nQ 56.59375 54.828125 56.59375 36.375 \r\nQ 56.59375 19.140625 48.40625 8.859375 \r\nQ 40.234375 -1.421875 26.421875 -1.421875 \r\nQ 22.703125 -1.421875 18.890625 -0.6875 \r\nQ 15.09375 0.046875 10.984375 1.515625 \r\nz\r\nM 30.609375 32.421875 \r\nQ 37.25 32.421875 41.125 36.953125 \r\nQ 45.015625 41.5 45.015625 49.421875 \r\nQ 45.015625 57.28125 41.125 61.84375 \r\nQ 37.25 66.40625 30.609375 66.40625 \r\nQ 23.96875 66.40625 20.09375 61.84375 \r\nQ 16.21875 57.28125 16.21875 49.421875 \r\nQ 16.21875 41.5 20.09375 36.953125 \r\nQ 23.96875 32.421875 30.609375 32.421875 \r\nz\r\n\" id=\"DejaVuSans-57\"/>\r\n </defs>\r\n <g transform=\"translate(335.810417 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-57\"/>\r\n </g>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"matplotlib.axis_2\">\r\n <g id=\"ytick_1\">\r\n <g id=\"line2d_10\">\r\n <defs>\r\n <path d=\"M 0 0 \r\nL -3.5 0 \r\n\" id=\"mb67ebef0ca\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n </defs>\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#mb67ebef0ca\" y=\"197.5914\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_10\">\r\n <!-- 20 -->\r\n <defs>\r\n <path d=\"M 31.78125 66.40625 \r\nQ 24.171875 66.40625 20.328125 58.90625 \r\nQ 16.5 51.421875 16.5 36.375 \r\nQ 16.5 21.390625 20.328125 13.890625 \r\nQ 24.171875 6.390625 31.78125 6.390625 \r\nQ 39.453125 6.390625 43.28125 13.890625 \r\nQ 47.125 21.390625 47.125 36.375 \r\nQ 47.125 51.421875 43.28125 58.90625 \r\nQ 39.453125 66.40625 31.78125 66.40625 \r\nz\r\nM 31.78125 74.21875 \r\nQ 44.046875 74.21875 50.515625 64.515625 \r\nQ 56.984375 54.828125 56.984375 36.375 \r\nQ 56.984375 17.96875 50.515625 8.265625 \r\nQ 44.046875 -1.421875 31.78125 -1.421875 \r\nQ 19.53125 -1.421875 13.0625 8.265625 \r\nQ 6.59375 17.96875 6.59375 36.375 \r\nQ 6.59375 54.828125 13.0625 64.515625 \r\nQ 19.53125 74.21875 31.78125 74.21875 \r\nz\r\n\" id=\"DejaVuSans-48\"/>\r\n </defs>\r\n <g transform=\"translate(7.2 201.390619)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-50\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_2\">\r\n <g id=\"line2d_11\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#mb67ebef0ca\" y=\"149.455996\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_11\">\r\n <!-- 40 -->\r\n <g transform=\"translate(7.2 153.255215)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-52\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_3\">\r\n <g id=\"line2d_12\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#mb67ebef0ca\" y=\"101.320593\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_12\">\r\n <!-- 60 -->\r\n <g transform=\"translate(7.2 105.119812)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-54\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_4\">\r\n <g id=\"line2d_13\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#mb67ebef0ca\" y=\"53.185189\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_13\">\r\n <!-- 80 -->\r\n <g transform=\"translate(7.2 56.984408)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-56\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"line2d_14\">\r\n <path clip-path=\"url(#p84b38d787b)\" d=\"M 293.900758 54.443219 \r\nL 260.082576 75.977821 \r\nL 42.143182 214.756364 \r\nL 192.446212 119.047024 \r\nL 290.143182 56.835953 \r\nL 124.809848 162.116227 \r\nL 312.688636 42.479552 \r\nL 346.506818 20.94495 \r\nL 230.02197 95.119689 \r\nL 132.325 157.33076 \r\nL 102.264394 176.472628 \r\nL 207.476515 109.47609 \r\nL 102.264394 176.472628 \r\nL 320.203788 37.694085 \r\nL 94.749242 181.258095 \r\nL 181.173485 126.225224 \r\nL 335.234091 28.123151 \r\nL 169.900758 133.403425 \r\n\" style=\"fill:none;stroke:#0000ff;stroke-linecap:square;stroke-width:1.5;\"/>\r\n <defs>\r\n <path d=\"M 0 3 \r\nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\nC 2.683901 1.55874 3 0.795609 3 0 \r\nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\nC 1.55874 -2.683901 0.795609 -3 0 -3 \r\nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\nC -2.683901 -1.55874 -3 -0.795609 -3 0 \r\nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\nC -1.55874 2.683901 -0.795609 3 0 3 \r\nz\r\n\" id=\"m8cf8ee1d9b\" style=\"stroke:#0000ff;\"/>\r\n </defs>\r\n <g clip-path=\"url(#p84b38d787b)\">\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"293.900758\" xlink:href=\"#m8cf8ee1d9b\" y=\"54.443219\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"260.082576\" xlink:href=\"#m8cf8ee1d9b\" y=\"75.977821\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"42.143182\" xlink:href=\"#m8cf8ee1d9b\" y=\"214.756364\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"192.446212\" xlink:href=\"#m8cf8ee1d9b\" y=\"119.047024\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"290.143182\" xlink:href=\"#m8cf8ee1d9b\" y=\"56.835953\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"124.809848\" xlink:href=\"#m8cf8ee1d9b\" y=\"162.116227\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"312.688636\" xlink:href=\"#m8cf8ee1d9b\" y=\"42.479552\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"346.506818\" xlink:href=\"#m8cf8ee1d9b\" y=\"20.94495\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"230.02197\" xlink:href=\"#m8cf8ee1d9b\" y=\"95.119689\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"132.325\" xlink:href=\"#m8cf8ee1d9b\" y=\"157.33076\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"102.264394\" xlink:href=\"#m8cf8ee1d9b\" y=\"176.472628\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"207.476515\" xlink:href=\"#m8cf8ee1d9b\" y=\"109.47609\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"102.264394\" xlink:href=\"#m8cf8ee1d9b\" y=\"176.472628\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"320.203788\" xlink:href=\"#m8cf8ee1d9b\" y=\"37.694085\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"94.749242\" xlink:href=\"#m8cf8ee1d9b\" y=\"181.258095\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"181.173485\" xlink:href=\"#m8cf8ee1d9b\" y=\"126.225224\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"335.234091\" xlink:href=\"#m8cf8ee1d9b\" y=\"28.123151\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"169.900758\" xlink:href=\"#m8cf8ee1d9b\" y=\"133.403425\"/>\r\n </g>\r\n </g>\r\n <g id=\"patch_3\">\r\n <path d=\"M 26.925 224.64 \r\nL 26.925 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_4\">\r\n <path d=\"M 361.725 224.64 \r\nL 361.725 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_5\">\r\n <path d=\"M 26.925 224.64 \r\nL 361.725 224.64 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_6\">\r\n <path d=\"M 26.925 7.2 \r\nL 361.725 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"p84b38d787b\">\r\n <rect height=\"217.44\" width=\"334.8\" x=\"26.925\" y=\"7.2\"/>\r\n </clipPath>\r\n </defs>\r\n</svg>\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": "<Figure size 432x288 with 1 Axes>",
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"248.518125pt\" version=\"1.1\" viewBox=\"0 0 368.925 248.518125\" width=\"368.925pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <defs>\r\n <style type=\"text/css\">\r\n*{stroke-linecap:butt;stroke-linejoin:round;}\r\n </style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n <g id=\"patch_1\">\r\n <path d=\"M -0 248.518125 \r\nL 368.925 248.518125 \r\nL 368.925 0 \r\nL -0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n </g>\r\n <g id=\"axes_1\">\r\n <g id=\"patch_2\">\r\n <path d=\"M 26.925 224.64 \r\nL 361.725 224.64 \r\nL 361.725 7.2 \r\nL 26.925 7.2 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n </g>\r\n <g id=\"PathCollection_1\">\r\n <defs>\r\n <path d=\"M 0 3 \r\nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\nC 2.683901 1.55874 3 0.795609 3 0 \r\nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\nC 1.55874 -2.683901 0.795609 -3 0 -3 \r\nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\nC -2.683901 -1.55874 -3 -0.795609 -3 0 \r\nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\nC -1.55874 2.683901 -0.795609 3 0 3 \r\nz\r\n\" id=\"mdd901337b6\" style=\"stroke:#ff0000;\"/>\r\n </defs>\r\n <g clip-path=\"url(#pf928d7432c)\">\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"42.143182\" xlink:href=\"#mdd901337b6\" y=\"204.12295\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"129.841179\" xlink:href=\"#mdd901337b6\" y=\"180.532671\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"346.506818\" xlink:href=\"#mdd901337b6\" y=\"38.990998\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"93.730239\" xlink:href=\"#mdd901337b6\" y=\"170.422552\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"269.126233\" xlink:href=\"#mdd901337b6\" y=\"62.581277\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"160.793413\" xlink:href=\"#mdd901337b6\" y=\"153.572353\"/>\r\n <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"62.778005\" xlink:href=\"#mdd901337b6\" y=\"190.642791\"/>\r\n </g>\r\n </g>\r\n <g id=\"matplotlib.axis_1\">\r\n <g id=\"xtick_1\">\r\n <g id=\"line2d_1\">\r\n <defs>\r\n <path d=\"M 0 0 \r\nL 0 3.5 \r\n\" id=\"mfb6aae1634\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n </defs>\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"67.93671\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_1\">\r\n <!-- 2 -->\r\n <defs>\r\n <path d=\"M 19.1875 8.296875 \r\nL 53.609375 8.296875 \r\nL 53.609375 0 \r\nL 7.328125 0 \r\nL 7.328125 8.296875 \r\nQ 12.9375 14.109375 22.625 23.890625 \r\nQ 32.328125 33.6875 34.8125 36.53125 \r\nQ 39.546875 41.84375 41.421875 45.53125 \r\nQ 43.3125 49.21875 43.3125 52.78125 \r\nQ 43.3125 58.59375 39.234375 62.25 \r\nQ 35.15625 65.921875 28.609375 65.921875 \r\nQ 23.96875 65.921875 18.8125 64.3125 \r\nQ 13.671875 62.703125 7.8125 59.421875 \r\nL 7.8125 69.390625 \r\nQ 13.765625 71.78125 18.9375 73 \r\nQ 24.125 74.21875 28.421875 74.21875 \r\nQ 39.75 74.21875 46.484375 68.546875 \r\nQ 53.21875 62.890625 53.21875 53.421875 \r\nQ 53.21875 48.921875 51.53125 44.890625 \r\nQ 49.859375 40.875 45.40625 35.40625 \r\nQ 44.1875 33.984375 37.640625 27.21875 \r\nQ 31.109375 20.453125 19.1875 8.296875 \r\nz\r\n\" id=\"DejaVuSans-50\"/>\r\n </defs>\r\n <g transform=\"translate(64.75546 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-50\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_2\">\r\n <g id=\"line2d_2\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"119.523767\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_2\">\r\n <!-- 3 -->\r\n <defs>\r\n <path d=\"M 40.578125 39.3125 \r\nQ 47.65625 37.796875 51.625 33 \r\nQ 55.609375 28.21875 55.609375 21.1875 \r\nQ 55.609375 10.40625 48.1875 4.484375 \r\nQ 40.765625 -1.421875 27.09375 -1.421875 \r\nQ 22.515625 -1.421875 17.65625 -0.515625 \r\nQ 12.796875 0.390625 7.625 2.203125 \r\nL 7.625 11.71875 \r\nQ 11.71875 9.328125 16.59375 8.109375 \r\nQ 21.484375 6.890625 26.8125 6.890625 \r\nQ 36.078125 6.890625 40.9375 10.546875 \r\nQ 45.796875 14.203125 45.796875 21.1875 \r\nQ 45.796875 27.640625 41.28125 31.265625 \r\nQ 36.765625 34.90625 28.71875 34.90625 \r\nL 20.21875 34.90625 \r\nL 20.21875 43.015625 \r\nL 29.109375 43.015625 \r\nQ 36.375 43.015625 40.234375 45.921875 \r\nQ 44.09375 48.828125 44.09375 54.296875 \r\nQ 44.09375 59.90625 40.109375 62.90625 \r\nQ 36.140625 65.921875 28.71875 65.921875 \r\nQ 24.65625 65.921875 20.015625 65.03125 \r\nQ 15.375 64.15625 9.8125 62.3125 \r\nL 9.8125 71.09375 \r\nQ 15.4375 72.65625 20.34375 73.4375 \r\nQ 25.25 74.21875 29.59375 74.21875 \r\nQ 40.828125 74.21875 47.359375 69.109375 \r\nQ 53.90625 64.015625 53.90625 55.328125 \r\nQ 53.90625 49.265625 50.4375 45.09375 \r\nQ 46.96875 40.921875 40.578125 39.3125 \r\nz\r\n\" id=\"DejaVuSans-51\"/>\r\n </defs>\r\n <g transform=\"translate(116.342517 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-51\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_3\">\r\n <g id=\"line2d_3\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"171.110824\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_3\">\r\n <!-- 4 -->\r\n <defs>\r\n <path d=\"M 37.796875 64.3125 \r\nL 12.890625 25.390625 \r\nL 37.796875 25.390625 \r\nz\r\nM 35.203125 72.90625 \r\nL 47.609375 72.90625 \r\nL 47.609375 25.390625 \r\nL 58.015625 25.390625 \r\nL 58.015625 17.1875 \r\nL 47.609375 17.1875 \r\nL 47.609375 0 \r\nL 37.796875 0 \r\nL 37.796875 17.1875 \r\nL 4.890625 17.1875 \r\nL 4.890625 26.703125 \r\nz\r\n\" id=\"DejaVuSans-52\"/>\r\n </defs>\r\n <g transform=\"translate(167.929574 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-52\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_4\">\r\n <g id=\"line2d_4\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"222.697881\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_4\">\r\n <!-- 5 -->\r\n <defs>\r\n <path d=\"M 10.796875 72.90625 \r\nL 49.515625 72.90625 \r\nL 49.515625 64.59375 \r\nL 19.828125 64.59375 \r\nL 19.828125 46.734375 \r\nQ 21.96875 47.46875 24.109375 47.828125 \r\nQ 26.265625 48.1875 28.421875 48.1875 \r\nQ 40.625 48.1875 47.75 41.5 \r\nQ 54.890625 34.8125 54.890625 23.390625 \r\nQ 54.890625 11.625 47.5625 5.09375 \r\nQ 40.234375 -1.421875 26.90625 -1.421875 \r\nQ 22.3125 -1.421875 17.546875 -0.640625 \r\nQ 12.796875 0.140625 7.71875 1.703125 \r\nL 7.71875 11.625 \r\nQ 12.109375 9.234375 16.796875 8.0625 \r\nQ 21.484375 6.890625 26.703125 6.890625 \r\nQ 35.15625 6.890625 40.078125 11.328125 \r\nQ 45.015625 15.765625 45.015625 23.390625 \r\nQ 45.015625 31 40.078125 35.4375 \r\nQ 35.15625 39.890625 26.703125 39.890625 \r\nQ 22.75 39.890625 18.8125 39.015625 \r\nQ 14.890625 38.140625 10.796875 36.28125 \r\nz\r\n\" id=\"DejaVuSans-53\"/>\r\n </defs>\r\n <g transform=\"translate(219.516631 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-53\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_5\">\r\n <g id=\"line2d_5\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"274.284938\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_5\">\r\n <!-- 6 -->\r\n <defs>\r\n <path d=\"M 33.015625 40.375 \r\nQ 26.375 40.375 22.484375 35.828125 \r\nQ 18.609375 31.296875 18.609375 23.390625 \r\nQ 18.609375 15.53125 22.484375 10.953125 \r\nQ 26.375 6.390625 33.015625 6.390625 \r\nQ 39.65625 6.390625 43.53125 10.953125 \r\nQ 47.40625 15.53125 47.40625 23.390625 \r\nQ 47.40625 31.296875 43.53125 35.828125 \r\nQ 39.65625 40.375 33.015625 40.375 \r\nz\r\nM 52.59375 71.296875 \r\nL 52.59375 62.3125 \r\nQ 48.875 64.0625 45.09375 64.984375 \r\nQ 41.3125 65.921875 37.59375 65.921875 \r\nQ 27.828125 65.921875 22.671875 59.328125 \r\nQ 17.53125 52.734375 16.796875 39.40625 \r\nQ 19.671875 43.65625 24.015625 45.921875 \r\nQ 28.375 48.1875 33.59375 48.1875 \r\nQ 44.578125 48.1875 50.953125 41.515625 \r\nQ 57.328125 34.859375 57.328125 23.390625 \r\nQ 57.328125 12.15625 50.6875 5.359375 \r\nQ 44.046875 -1.421875 33.015625 -1.421875 \r\nQ 20.359375 -1.421875 13.671875 8.265625 \r\nQ 6.984375 17.96875 6.984375 36.375 \r\nQ 6.984375 53.65625 15.1875 63.9375 \r\nQ 23.390625 74.21875 37.203125 74.21875 \r\nQ 40.921875 74.21875 44.703125 73.484375 \r\nQ 48.484375 72.75 52.59375 71.296875 \r\nz\r\n\" id=\"DejaVuSans-54\"/>\r\n </defs>\r\n <g transform=\"translate(271.103688 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-54\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_6\">\r\n <g id=\"line2d_6\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"325.871995\" xlink:href=\"#mfb6aae1634\" y=\"224.64\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_6\">\r\n <!-- 7 -->\r\n <defs>\r\n <path d=\"M 8.203125 72.90625 \r\nL 55.078125 72.90625 \r\nL 55.078125 68.703125 \r\nL 28.609375 0 \r\nL 18.3125 0 \r\nL 43.21875 64.59375 \r\nL 8.203125 64.59375 \r\nz\r\n\" id=\"DejaVuSans-55\"/>\r\n </defs>\r\n <g transform=\"translate(322.690745 239.238437)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-55\"/>\r\n </g>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"matplotlib.axis_2\">\r\n <g id=\"ytick_1\">\r\n <g id=\"line2d_7\">\r\n <defs>\r\n <path d=\"M 0 0 \r\nL -3.5 0 \r\n\" id=\"m02266ca8bc\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n </defs>\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"204.12295\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_7\">\r\n <!-- 20 -->\r\n <defs>\r\n <path d=\"M 31.78125 66.40625 \r\nQ 24.171875 66.40625 20.328125 58.90625 \r\nQ 16.5 51.421875 16.5 36.375 \r\nQ 16.5 21.390625 20.328125 13.890625 \r\nQ 24.171875 6.390625 31.78125 6.390625 \r\nQ 39.453125 6.390625 43.28125 13.890625 \r\nQ 47.125 21.390625 47.125 36.375 \r\nQ 47.125 51.421875 43.28125 58.90625 \r\nQ 39.453125 66.40625 31.78125 66.40625 \r\nz\r\nM 31.78125 74.21875 \r\nQ 44.046875 74.21875 50.515625 64.515625 \r\nQ 56.984375 54.828125 56.984375 36.375 \r\nQ 56.984375 17.96875 50.515625 8.265625 \r\nQ 44.046875 -1.421875 31.78125 -1.421875 \r\nQ 19.53125 -1.421875 13.0625 8.265625 \r\nQ 6.59375 17.96875 6.59375 36.375 \r\nQ 6.59375 54.828125 13.0625 64.515625 \r\nQ 19.53125 74.21875 31.78125 74.21875 \r\nz\r\n\" id=\"DejaVuSans-48\"/>\r\n </defs>\r\n <g transform=\"translate(7.2 207.922169)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-50\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_2\">\r\n <g id=\"line2d_8\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"170.422552\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_8\">\r\n <!-- 30 -->\r\n <g transform=\"translate(7.2 174.221771)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-51\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_3\">\r\n <g id=\"line2d_9\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"136.722153\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_9\">\r\n <!-- 40 -->\r\n <g transform=\"translate(7.2 140.521372)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-52\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_4\">\r\n <g id=\"line2d_10\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"103.021755\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_10\">\r\n <!-- 50 -->\r\n <g transform=\"translate(7.2 106.820974)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-53\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_5\">\r\n <g id=\"line2d_11\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"69.321357\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_11\">\r\n <!-- 60 -->\r\n <g transform=\"translate(7.2 73.120575)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-54\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"ytick_6\">\r\n <g id=\"line2d_12\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"26.925\" xlink:href=\"#m02266ca8bc\" y=\"35.620958\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_12\">\r\n <!-- 70 -->\r\n <g transform=\"translate(7.2 39.420177)scale(0.1 -0.1)\">\r\n <use xlink:href=\"#DejaVuSans-55\"/>\r\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n </g>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"line2d_13\">\r\n <path clip-path=\"url(#pf928d7432c)\" d=\"M 42.143182 214.756364 \r\nL 129.841179 157.799815 \r\nL 346.506818 17.083636 \r\nL 93.730239 181.252512 \r\nL 269.126233 67.339414 \r\nL 160.793413 137.697504 \r\nL 62.778005 201.354823 \r\n\" style=\"fill:none;stroke:#0000ff;stroke-linecap:square;stroke-width:1.5;\"/>\r\n <defs>\r\n <path d=\"M 0 3 \r\nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\nC 2.683901 1.55874 3 0.795609 3 0 \r\nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\nC 1.55874 -2.683901 0.795609 -3 0 -3 \r\nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\nC -2.683901 -1.55874 -3 -0.795609 -3 0 \r\nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\nC -1.55874 2.683901 -0.795609 3 0 3 \r\nz\r\n\" id=\"m0c653970b7\" style=\"stroke:#0000ff;\"/>\r\n </defs>\r\n <g clip-path=\"url(#pf928d7432c)\">\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"42.143182\" xlink:href=\"#m0c653970b7\" y=\"214.756364\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"129.841179\" xlink:href=\"#m0c653970b7\" y=\"157.799815\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"346.506818\" xlink:href=\"#m0c653970b7\" y=\"17.083636\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"93.730239\" xlink:href=\"#m0c653970b7\" y=\"181.252512\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"269.126233\" xlink:href=\"#m0c653970b7\" y=\"67.339414\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"160.793413\" xlink:href=\"#m0c653970b7\" y=\"137.697504\"/>\r\n <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"62.778005\" xlink:href=\"#m0c653970b7\" y=\"201.354823\"/>\r\n </g>\r\n </g>\r\n <g id=\"patch_3\">\r\n <path d=\"M 26.925 224.64 \r\nL 26.925 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_4\">\r\n <path d=\"M 361.725 224.64 \r\nL 361.725 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_5\">\r\n <path d=\"M 26.925 224.64 \r\nL 361.725 224.64 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"patch_6\">\r\n <path d=\"M 26.925 7.2 \r\nL 361.725 7.2 \r\n\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"pf928d7432c\">\r\n <rect height=\"217.44\" width=\"334.8\" x=\"26.925\" y=\"7.2\"/>\r\n </clipPath>\r\n </defs>\r\n</svg>\r\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAajUlEQVR4nO3df5BV5X3H8fcX5IegBCkrxSBsMJSoLSjdgUYTqyVkNFp/TEYrQxLaxGxqmhZr0oolk5hkyFDbGjNOxFBIhsSNGIkUYtSGrmL8EcWF4K9ARZBFZWVXqoBABJZv/3jOZvfsD/bu3nPvuefez2tm5+5z9sf93kg+fHnueZ7H3B0REcmeAWkXICIi/aMAFxHJKAW4iEhGKcBFRDJKAS4iklEnFPPJRo8e7dXV1cV8ShGRzNuwYcNb7l7V+XpRA7y6upqGhoZiPqWISOaZWWN31zWFIiKSUQpwEZGMUoCLiGSUAlxEJKMU4CIiGaUAFxEpoLo6qK6GAQPCY11dcr+7qLcRiohUkro6qK2FgwfDuLExjAHmzMn/96sDFxEpkAUL2sO7zcGD4XoSFOAiIgXgHjru7uzcmcxzKMBFRBK2YUOY8+7J+PHJPI8CXEQkIceOwfnnQ01NGI8YAcOGxb9n2DBYuDCZ51OAi4gkoL4eBg6Ep54K44cegr17YckSmDABzMLjkiXJvIEJugtFRCQvR47ApEnt893nngvPPhvCHEJYJxXYnakDFxHpp/vug8GD28P717+GjRvbw7vQ1IGLiPTRgQNwyimh+wa49FL4+c/DNEkxqQMXEemDxYvhpJPaw/ull+CBB4of3qAOXEQkJ3v2wOjR7ePPfz68IZkmdeAiIr34xjfi4d3YmH54gzpwEZEevfZafNHN174WwrxUKMBFRLrxxS+G+e42LS3xLrwUaApFRKSDzZvDG5Jt4X3HHWFfk1ILb1AHLiIChJC+6ipYvTqMzWDfvnDHSalSBy4iFW/9+rD5VFt4r1gR9jUp5fAGdeAiUsFaW2HGjLB7IMDpp8Mrr4TVlVnQawduZpPNbFOHj31mdoOZjTKztWa2NXo8pRgFi4gk4b//G044oT28f/nLsE93VsIbcghwd/9fdz/H3c8B/hQ4CKwC5gP17j4JqI/GIiIl7fBhOO00uPjiMJ4xI3Tis2alW1d/9HUOfCawzd0bgSuA5dH15cCVSRYmIpK0FStgyBBoagrjZ56Bp58+/uELpayvZV8L3BN9PsbdmwCix1O7+wEzqzWzBjNraGlp6X+lIiL99O674a6S2bPD+KqrwpuU06cX4ckLeCx9zgFuZoOBy4H7+vIE7r7E3Wvcvaaqqqqv9YmI5OWOO+Dkk9vHmzfD/fcXafOptmPpGxvbD8msrU0sxPvSgV8CbHT33dF4t5mNBYgemxOpSEQkAS0tIaT/4R/C+ItfDBn6oQ8VsYgCH0vflwCfTfv0CcAaYG70+VxgdSIViYjk6atfhVM7TOq+9hp873spFNLT8fMJHUufU4Cb2TBgFnB/h8uLgFlmtjX62qJEKhIR6afGxtB1tx0a/M1vhq573LiUCurp+PmEjqXPaSGPux8E/qDTtT2Eu1JERFJ33XWwbFn7eM8eGDUqvXqA8DdJbW18GiXBY+kzevOMiEjw0kuh624L77vuCl136uEN4TTjAh5Lr6X0IpJJ7uEsyoceCuMhQ0LXPXx4unV1UcBj6dWBi0jmPPVUuK26LbxXroTf/a4Ew7vA1IGLSGa0tsK0afD882E8cSJs2QKDBqVbV1rUgYtIJjz4YNh8qi286+th27bKDW9QBy4iJe6998JtgG+9FcYf+Qg89lh29y9Jkv4nEJGS9eMfw9Ch7eHd0ACPP67wbqMOXERKzr598L73tY//6q/gnnuKtH9JhujvMREpKbfdFg/vl18O28AqvLtSBy4iJWH3bvjDP2wfz5sHt9+eXj1ZoA5cRFJ3003x8N61S+GdCwW4iKTm1VfD1Mitt4bxt78dVliOHZtuXVmhKRQRScVnPhPuMmnz9tswcmR69WSROnARKarnnw9dd1t4L10aum6Fd9+pAxeRonAPJ7/X14fxySeHNy5PPDHdurJMHbiIFFzb4pu28F61KtzrrfDOjzpwESmYo0dhypRwkDDA5Mnw4othTxPJnzpwESmINWvCRlNt4b1uXdg5UOGdHAW4iOSmrg6qq8NcSHV1GHfj0KHwhuQVV4TxRRfBsWPw539etEorhgJcRHpXVxfOdmxsDO9GNjaGcacQ/+EPw5GPe/eG8aZN8MgjWgZfKApwEendggXxg3khjBcsAOCdd0JIf/az4Utz5oScnzq1yHVWGAW4iPRu584er996K5xySvulbdvg7ruLU1alU4CLSO/Gj6eO2VTzKgNopZpX+R7XY36Mm24K3/KVr4Sue+LEdEutJHo/WER6VfeJu6ldfC4HCacGN1LNl7jz919vaopvRiXFkVMHbmYjzWylmW0xs81m9mEzG2Vma81sa/R4Su+/SUSyaMGDH/l9eHc0cmTouhXe6ch1CuW7wMPu/iFgKrAZmA/Uu/skoD4ai0gZ6mkKvO1uE0lHrwFuZiOAC4BlAO5+2N3fAa4Alkffthy4slBFikh6fvCD0GV3Z/z44tYicbnMgU8EWoAfmtlUYAMwDxjj7k0A7t5kZqd298NmVgvUAozXf22RzGhtPf6qyWHDYOHC4tUjXeUyhXICMA1Y7O7nAgfow3SJuy9x9xp3r6mqqupnmSJSTLfcEg/vL3wh3Bo4YUK433vCBFiyJNzvLenJpQN/HXjd3Z+JxisJAb7bzMZG3fdYoLlQRYpIcRw6FDrrjn73OxgyJHyuwC4tvXbg7v4m8JqZTY4uzQR+C6wB5kbX5gKrC1KhiBTFZz4TD+9Fi8Lcd1t4S+nJ9T7wvwfqzGwwsB34G0L4/9TMPgfsBK4uTIkiUkh79sDo0fFrra1hzyopbTkFuLtvAmq6+dLMZMsRkWKaMQPWr28f33MPXHttevVI32glpkgF2r4dzjgjfq2nWwWldOkfSSIVZvjweHivW6fwzip14CIV4tlnYfr0+DUFd7YpwEUqQOcDFV58Ec4+O51aJDmaQhEpYw88EA/vD3wgdN0K7/KgDlykDLl3vQ3wjTfgtNPSqUcKQx24SJm56654eH/iEyHQFd7lRx24SJnobvOpvXthxIh06pHCUwcuUgZuvjke3vPmha5b4V3e1IGLZNiBA3DSSfFrhw/DoEHp1CPFpQ5cJKOuuSYe3t/5Tui6Fd6VQx24SMY0N8OYMfFrx451vddbyp86cJEMmTIlHt4rV4auW+FdmdSBi2TAyy/D5Mnxa1oGL+rARUrcgAHx8H7iCYW3BOrARUrUr38N550Xv6bglo4U4CIlqPOc9pYtXadQRDSFIlJCVq2Kh/eZZ4auW+Et3VEHLlICutt86s03u94uKNKROnCRlN1xRzy8r7oqBLrCW3qjDlwkJUeOwODB8Wv793ddGi/SE3XgIin48pfj4f1P/xS6boW39IU6cJEi2r+/6w6BR4503QZWJBfqwEWK5PLL4+F9552h61Z4S3/pj45IgTU1dT0NR5tPSRJy6sDNbIeZvWBmm8ysIbo2yszWmtnW6PGUwpYqkj2TJsXDe/VqbT4lyenLFMpF7n6Ou9dE4/lAvbtPAuqjsYgAmzeHkH7llfZr7mEaRSQp+cyBXwEsjz5fDlyZfzki2WcGZ53VPn76ae1hIoWRa4A78Esz22BmtdG1Me7eBBA9ntrdD5pZrZk1mFlDS0tL/hWLlKjHH49PjQwZEoJ7xoz0apLyluubmOe7+y4zOxVYa2Zbcn0Cd18CLAGoqalRHyJlqfOc9iuvwBlnpFOLVI6cOnB33xU9NgOrgOnAbjMbCxA9NheqSJFSde+98fCeNi103QpvKYZeO3AzGw4McPf90ecfB74JrAHmAouix9WFLFSklHS3+VRLC4wenU49Uply6cDHAE+Y2XPAeuAX7v4wIbhnmdlWYFY0Fil7//7v8fCePTsEusJbiq3XDtzdtwNTu7m+B5hZiKJEStHhw+GNyY4OHIBhw9KpR0RL6UVy8KUvxcP7q18NXbfCW9KkpfQix7F3L4wcGb929CgMHJhOPSIdqQMX6cGsWfHwXro0dN0KbykV6sBFOnn9dTj99Pg1bT4lpUgduEgH48bFw/vBB7X5lJQudeAiwAsvwJQp8Wvav0RKnTpwqXhm8fDesEHhLdmgAJeK9cgj8amRkSNDcE+bll5NIn2hKRSpSJ3ntF99FaqrUylFpN/UgUtF+fGP4+F93nmh61Z4SxapA5eKcOxY1/u39+yBUaPSqUckCerApex9+9vx8P7rvw5dt8Jbsk4duJSt996DoUPj1w4d6npNJKvUgUtZuu66eFB/61uh61Z4SzlRBy5l5e23u06NtLZ2PXxBpBzoj7WUjY9+NB7ey5d3f3KOSLlQBy6Z19jY9TZAraSUSqDeRDJt9Oh4eK9dq/CWyqEOXDLpN7/puuRdwS2VRgEumdN5Gfxzz3XdSVCkEmgKRTLj4Yfj4T12bOi6Fd5SqdSBS8nr7k6SnTu7npojUmnUgUtJ+8EP4uE9c2YIdIW3iDpwKVGtrXBCpz+d77wD73tfOvWIlCJ14FJybrklHt5/+7eh61Z4i8Tl3IGb2UCgAXjD3S8zs1HAvUA1sAO4xt3fLkSRUhkOHYJhw+LX3nsPBg9Opx6RUteXDnwesLnDeD5Q7+6TgPpoLJKzurqwCGfAABg+PB7et94aum6Ft0jPcurAzWwccCmwELgxunwFcGH0+XJgHXBTsuVJuaqrg9paOHgwjNseIRy+0PlebxHpKtcO/Hbgn4FjHa6NcfcmgOjx1O5+0MxqzazBzBpaWlryKlbKx4IF8dBuM2GCwlskV70GuJldBjS7+4b+PIG7L3H3Gnevqaqq6s+vkDKzfXvYgKo7O3cWtxaRLMtlCuV84HIz+wQwFBhhZncDu81srLs3mdlYoLmQhUp5GD68+867zfjxxatFJOt67cDd/WZ3H+fu1cC1wCPu/ilgDTA3+ra5wOqCVSmZt359mBrpGN6d7zgZNgwWLixuXSJZls994IuAWWa2FZgVjUW6MIMZM9rHL70U7jBZsqR9znvChDCeMye9OkWyxryIe3DW1NR4Q0ND0Z5P0vXzn8Pll7ePJ06EbdvSq0ckq8xsg7vXdL6upfSSuO42n3rjDTjttHTqESlXWkovibrrrnh4X3ppCHSFt0jy1IFLIo4ehUGD4tf27YOTT06nHpFKoA5c8jZ/fjy8580LXbfCW6Sw1IFLvx04ACedFL92+HDXTlxECkMduPTL1VfHw/v220PXrfAWKR514NInzc0wZkz8mjafEkmHOnDJ2ZQp8fBeuTJ03QpvkXQowKVXL78cQvqFF9qvucMnP5nnL+64IXh1dRiLSM40hSLH1bm7fvJJOO+8BH5x5w3BGxvDGLSeXiRH6sClW0891TW83RMKb+h+Q/CDB8N1EcmJOnDponNwb9kCkycn/CQ9bfytDcFFcqYOvMJ1nIauqoqH91lnha478fCGnjf+1obgIjlTgFewtmnoxsYQ1G+91f61N98M274WzMKF2hBcJE8K8Ap2vHMpO9/rnbg5c7QhuEietB94hTpyBAYP7v5rZmFxjoiUhp72A1cHXoH+8R97Dm/QNLRIVugulAqyfz+MGBG/NmxY13MqNQ0tkg3qwCvEX/5lPLzvvFPnUopknTrwMtfU1PU0nI6bT82Zo8AWySp14GXsgx+Mh/eaNdp8SqScqAMvQ7/9LZx9dvxaEW82EpEiUQdeZszi4f3MMwpvkXKlAC8Tjz0WnxoZOjQE9/Tp6dUkIoXV6xSKmQ0FfgUMib5/pbt/3cxGAfcC1cAO4Bp3f7twpUpPOs9pv/IKnHFGOrWISPHk0oG/B/yFu08FzgEuNrM/A+YD9e4+CaiPxtKbBA8xWLEiHt41NaHrVniLVIZeO3APa+3fjYaDog8HrgAujK4vB9YBNyVeYTlJ6BAD95D/HbW0wOjRCdUpIpmQ0xy4mQ00s01AM7DW3Z8Bxrh7E0D0eGrhyiwTCRxi8G//Fg/vOXNCoCu8RSpPTrcRunsrcI6ZjQRWmdkf5/oEZlYL1AKMr/RNNvI4xODwYRgyJH7t4EE48cQE6hKRTOrTXSju/g5hquRiYLeZjQWIHpt7+Jkl7l7j7jVVVVV5lptx/TzE4Prr4+H9ta+FrlvhLVLZcrkLpQo44u7vmNmJwMeAfwXWAHOBRdHj6kIWWhYWLozPgcNxd4/auxdGjoxfO3oUBg4sYI0ikhm5dOBjgUfN7HngWcIc+AOE4J5lZluBWdFYjqcPhxh87GPx8F66NHTdCm8RaaMDHUrM66/D6afHr3XcfEpEKo8OdMiA006Lh/dDD2nzKRHpmTazKgHPPw9Tp8avaf8SEemNOvAi67wQ0ywe3hs3Fjm8E1wZKiLFpQ68iLpbiNlm1CjYs6cECurHylARSYc68CLqbiEmwPvfn0J4QyIrQ0UkPQrwIuppweWuXcWt4/fyWBkqIulTgBeBO1x0Uc9z26ntMNDPlaEiUhoU4AX22GPh/cF168K4834mx1mIWXgLF4YCOkq1IBHpCwV4gRw9CpMnw4UXhvGZZ8KRI7BsWU4LMYujDytDRaT0aCVmAfzXf8FVV7WPf/Ur+OhH06tHRLKtp5WYuo0wQYcOQVUVHDgQxjNnwtq1WkkpIoWhKZSELFsWpo/bwvu55+B//kfhLSKFU5kBnuDqw7ffDiF93XVh/OlPh7tNpkxJpFIRkR5VXoC3rT5sbAxJ27b6sB8hvmhRWEHZZts2+NGPEqxVROQ4Ki/AE1h9uGtX6LpvvjmMb7op/F0wcWKCdYqI9KLy3sTMc/XhDTfAd7/bPn7zTRgzJoG6RET6qPI68H6uPty6NXTdbeH9H/8Rum6Ft4ikpfICvI+rD93hmmvgj/6o/drevXDjjQWsUUQkB5UX4H1YfbhxY7hR5b77wvhHPwqBPmJEkWsWEelG5c2BQwjr4ywXP3YMLrgAnnwyjKuqwhT50KFFqk9EJAeV14H34tFHw8nvbeH9wAPQ3KzwFpHSU5kdeDeOHAmbT736ahhPnQobNoQwFxEpRerAgZUrYfDg9vB+8knYtEnhLSKlrSIDvONKejO4+upw/ZJLwvz3eeelWp6ISE4qLsA7r6Rvs2gRPPigNp8SkezoNcDN7HQze9TMNpvZS2Y2L7o+yszWmtnW6PGUglSY4MZTEJa/d3ew8OLFef1aEZGiy6UDPwp82d3PBP4M+DszOwuYD9S7+ySgPhonK8GNpyAcb/baa91/Tef4ikjW9Brg7t7k7hujz/cDm4H3A1cAy6NvWw5cmXh1CWw8BbBvH1x/fTje7IQe7rvROb4ikjV9mgM3s2rgXOAZYIy7N0EIeeDUHn6m1swazKyhpaWlb9XlufEUwC9+AWefHRZb3ngjfP/7OsdXRMpDzgFuZicBPwNucPd9uf6cuy9x9xp3r6mqqupbdf3ceArgrbfgU5+Cyy4LS9+feipsQPXZz+ocXxEpDzkFuJkNIoR3nbvfH13ebWZjo6+PBZoTr66PG09BmCpfsSKcAn/vvfD1r4c9TWbMaP+eOXNgx45wy+COHQpvEcmmXO5CMWAZsNndb+vwpTXA3OjzucDqxKvrw8ZTAG+8AVdeCbNnwwc+EIL7lltgyJDEKxMRSZ15x5uhu/sGs48AjwMvAMeiy/9CmAf/KTAe2Alc7e7/d7zfVVNT4w0NDfnW3IU7LF0KX/lKWBL/rW+Fgxe0klJEyoGZbXD3ms7Xe90Lxd2fAHpa3jIz38LytW0bfP7zYROqCy+E//xP+OAH065KRKTwMrsSs7UVbrsN/uRPwqZT3/8+1NcrvEWkcmRyN8IXX4TPfQ7Wrw93mSxeDOPGpV2ViEhxlXwH3nEl/YQJ8MlPwrRpsH07/OQnsGaNwltEKlNJd+BtK+nbFmPu3Bk+PvxhWL06nJQjIlKpSroD724lPcCuXQpvEZGSDvAEVtKLiJStkg7wPFbSi4iUvZIO8H6spBcRqRglHeB9XEkvIlJRSvouFAhhrcAWEemqpDtwERHpmQJcRCSjFOAiIhmlABcRySgFuIhIRvV6oEOiT2bWAjQW7Qn7ZzTwVtpFJKicXk85vRYor9dTTq8FSu/1THD3LhuIFDXAs8DMGro7+SKryun1lNNrgfJ6PeX0WiA7r0dTKCIiGaUAFxHJKAV4V0vSLiBh5fR6yum1QHm9nnJ6LZCR16M5cBGRjFIHLiKSUQpwEZGMUoBHzOx0M3vUzDab2UtmNi/tmvrLzIaa2Xozey56Ld9Iu6Z8mdlAM/uNmT2Qdi35MrMdZvaCmW0ys4a068mXmY00s5VmtiX6/8+H066pv8xscvTfpe1jn5ndkHZdPdEceMTMxgJj3X2jmZ0MbACudPffplxan5mZAcPd/V0zGwQ8Acxz96dTLq3fzOxGoAYY4e6XpV1PPsxsB1Dj7qW0UKTfzGw58Li7LzWzwcAwd38n7bryZWYDgTeAGe5ekgsQ1YFH3L3J3TdGn+8HNgPvT7eq/vHg3Wg4KPrI7N/UZjYOuBRYmnYtEmdmI4ALgGUA7n64HMI7MhPYVqrhDQrwbplZNXAu8Ey6lfRfNOWwCWgG1rp7Zl8LcDvwz8CxtAtJiAO/NLMNZlabdjF5mgi0AD+MpriWmtnwtItKyLXAPWkXcTwK8E7M7CTgZ8AN7r4v7Xr6y91b3f0cYBww3cz+OO2a+sPMLgOa3X1D2rUk6Hx3nwZcAvydmV2QdkF5OAGYBix293OBA8D8dEvKXzQVdDlwX9q1HI8CvINovvhnQJ273592PUmI/jm7Drg45VL663zg8mjeeAXwF2Z2d7ol5cfdd0WPzcAqYHq6FeXldeD1Dv/CW0kI9Ky7BNjo7rvTLuR4FOCR6I2/ZcBmd78t7XryYWZVZjYy+vxE4GPAlnSr6h93v9ndx7l7NeGftI+4+6dSLqvfzGx49CY50VTDx4EX062q/9z9TeA1M5scXZoJZO6N/27MpsSnTyADhxoX0fnAp4EXorljgH9x9wdT
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
Condensed preview — 45 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (540K chars).
[
{
"path": ".gitignore",
"chars": 1226,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": "Code/Day 11_K-NN.ipynb",
"chars": 9652,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"#机器学习100天——第十一天:K近邻法(K-NN)\"\n ]\n "
},
{
"path": "Code/Day 11_K-NN.md",
"chars": 1224,
"preview": "# K近邻法 (K-NN)\n\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info"
},
{
"path": "Code/Day 11_k-NN.py",
"chars": 1100,
"preview": "# Importing the libraries\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\n# Importing the datase"
},
{
"path": "Code/Day 13_SVM.ipynb",
"chars": 45136,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第13天:支持向量机 (SVM)\"\n ]\n"
},
{
"path": "Code/Day 13_SVM.md",
"chars": 2951,
"preview": "# Day 13 | 支持向量机 (SVM)\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/mas"
},
{
"path": "Code/Day 13_SVM.py",
"chars": 2793,
"preview": "#Day13: Support Vector Machine (SVM)\r\n\r\n#Importing the libraries\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\ni"
},
{
"path": "Code/Day 1_Data_Preprocessing.ipynb",
"chars": 10891,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第1天:数据预处理(Data Preproce"
},
{
"path": "Code/Day 1_Data_Preprocessing.md",
"chars": 1668,
"preview": "# 数据预处理\n\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graph"
},
{
"path": "Code/Day 1_Data_Preprocessing.py",
"chars": 2252,
"preview": "#Day 1: Data Prepocessing\n\n#Step 1: Importing the libraries\nimport numpy as np\nimport pandas as pd\n\n#Step 2: Importing d"
},
{
"path": "Code/Day 25_Decision_Tree.ipynb",
"chars": 46952,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第25天:决策树(Decision Tree)"
},
{
"path": "Code/Day 25_Decision_Tree.md",
"chars": 2775,
"preview": "# 决策树分类\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/raw/master/Info-graphs/"
},
{
"path": "Code/Day 25_Decision_Tree.py",
"chars": 2706,
"preview": "# Importing the libraries\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\n# Importing the datase"
},
{
"path": "Code/Day 2_Simple_Linear_Regression.ipynb",
"chars": 68020,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第二天:简单线性回归\\n\",\n \"## "
},
{
"path": "Code/Day 2_Simple_Linear_Regression.md",
"chars": 1052,
"preview": "# 简单线性回归模型\n\n\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-g"
},
{
"path": "Code/Day 2_Simple_Linear_Regression.py",
"chars": 905,
"preview": "# Data Preprocessing\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndataset = pd.read_csv('../d"
},
{
"path": "Code/Day 34_Random_Forests.ipynb",
"chars": 46429,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"导入库\"\n ]\n },\n {\n \"cell_type\": "
},
{
"path": "Code/Day 34_Random_Forests.md",
"chars": 3087,
"preview": "# 随机森林\n\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graphs"
},
{
"path": "Code/Day 34_Random_Forests.py",
"chars": 2714,
"preview": "# Importing the libraries\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\n# Importing the datase"
},
{
"path": "Code/Day 39.ipynb",
"chars": 36683,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"collapsed\": true\n },\n \"source\": [\n \"## 安装库\\n\""
},
{
"path": "Code/Day 3_Multiple_Linear_Regression.ipynb",
"chars": 18408,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第3天:多元线性回归(Multiple Lin"
},
{
"path": "Code/Day 3_Multiple_Linear_Regression.md",
"chars": 1071,
"preview": "# 多元线性回归\n\n\n<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-gra"
},
{
"path": "Code/Day 3_Multiple_Linear_Regression.py",
"chars": 1071,
"preview": "# Importing the libraries\nimport pandas as pd\nimport numpy as np\n\n# Importing the dataset\ndataset = pd.read_csv('../data"
},
{
"path": "Code/Day 40.ipynb",
"chars": 103087,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## 准备\\n\",\n \"\\n\",\n \"- 数据集下载地址请"
},
{
"path": "Code/Day 41.ipynb",
"chars": 4357,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 基础知识\\n\",\n \"基本的CNN结构如下: Convolu"
},
{
"path": "Code/Day 42.ipynb",
"chars": 9572,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"这是Python,TensorFlow和Keras教程系列的深度学习基"
},
{
"path": "Code/Day 6_Logistic_Regression.ipynb",
"chars": 45025,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 机器学习100天——第6天:逻辑回归(Linear Regress"
},
{
"path": "Code/Day 6_Logistic_Regression.md",
"chars": 3492,
"preview": "<p align=\"center\">\n <img src=\"https://github.com/MachineLearning100/100-Days-Of-ML-Code/blob/master/Info-graphs/Day%204"
},
{
"path": "Code/Day 6_Logistic_Regression.py",
"chars": 2611,
"preview": "# Importing the Libraries\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\n# Importing the datase"
},
{
"path": "Code/KafkaProducer.py",
"chars": 341,
"preview": "#!/usr/bin/python\n\nfrom kafka import KafkaProducer\n\nkafkaHosts=[\"kafka01.paas.longfor.sit:9092\"\n ,\"kafka02.pa"
},
{
"path": "Code/TestKafka.py",
"chars": 598,
"preview": "#!/usr/bin/python\n\nfrom kafka import KafkaConsumer;\n\n\nkafkaHosts=[\"kafka01.paas.longfor.sit:9092\"\n ,\"kafka02."
},
{
"path": "Code/my/Data_age_salary.csv",
"chars": 101,
"preview": "Age,Salary\n44,72000\n27,48000\n30,54000\n38,61000\n40,78000\n35,58000\n35,52000\n48,79000\n50,83000\n37,67000\n"
},
{
"path": "Code/my/LinerTest.py",
"chars": 134,
"preview": "import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndataset = pd.read_csv('Data_age_salary.csv');\nda"
},
{
"path": "FAQ.MD",
"chars": 1512,
"preview": "\n# 常见问题解答\n欢迎到Issues提问\n \n### 1. “拆分数据”和“特征缩放”的顺序\n可以先“拆分数据”,再“特征缩放”,但需要使用训练集的fit参数,去transform测试集,以保证参数相同。\n\n详见[issue#41](ht"
},
{
"path": "LICENSE",
"chars": 1075,
"preview": "MIT License\n\nCopyright (c) 2018 MachineLearning100\n\nPermission is hereby granted, free of charge, to any person obtainin"
},
{
"path": "Other Docs/README.md",
"chars": 5,
"preview": "演示图片\n"
},
{
"path": "Other Docs/速查手册/README.md",
"chars": 5481,
"preview": "# 14张速查表,带你玩转 Python 数据科学\n译自 DataCamp 的速查表,有兴趣的朋友可以在这里查看[英文原版](https://www.datacamp.com/community/data-science-cheatshee"
},
{
"path": "README.md",
"chars": 13094,
"preview": "# 机器学习100天\n\n英文原版请移步[Avik-Jain](https://github.com/Avik-Jain/100-Days-Of-ML-Code)。数据在[这里](https://github.com/MachineLearn"
},
{
"path": "Translation specification.MD",
"chars": 640,
"preview": "## 翻译规范`v20180809`\n### 交付物\n>- 图片(.jpg),质量选择最高,源文件自己保留好,文件命名`Day xxx.jpg`\n>- 代码,含md、py、notebook等,要求调试通过,数据引用datasets文件夹`."
},
{
"path": "datasets/50_Startups.csv",
"chars": 2436,
"preview": "R&D Spend,Administration,Marketing Spend,State,Profit\r\n165349.2,136897.8,471784.1,New York,192261.83\r\n162597.7,151377.59"
},
{
"path": "datasets/Data.csv",
"chars": 226,
"preview": "Country,Age,Salary,Purchased\r\nFrance,44,72000,No\r\nSpain,27,48000,Yes\r\nGermany,30,54000,No\r\nSpain,38,61000,No\r\nGermany,40"
},
{
"path": "datasets/Social_Network_Ads.csv",
"chars": 10926,
"preview": "User ID,Gender,Age,EstimatedSalary,Purchased\r\n15624510,Male,19,19000,0\r\n15810944,Male,35,20000,0\r\n15668575,Female,26,430"
},
{
"path": "datasets/readme.md",
"chars": 160,
"preview": "## 代码中使用的数据\n\n 50 50_Startups.csv\n\n 10 Data.csv\n\n 400 Social_Network_Ads.csv\n\n 40966 mnist.npz\n\n "
},
{
"path": "datasets/studentscores.csv",
"chars": 236,
"preview": "Hours,Scores\r\n2.5,21\r\n5.1,47\r\n3.2,27\r\n8.5,75\r\n3.5,30\r\n1.5,20\r\n9.2,88\r\n5.5,60\r\n8.3,81\r\n2.7,25\r\n7.7,85\r\n5.9,62\r\n4.5,41\r\n3."
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the MLEveryday/100-Days-Of-ML-Code GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 45 files (11.5 MB), approximately 287.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.