Python 30 天 – 第 28 天 – 机器学习和数据科学 II

作者 : 慕源网 本文共4900个字,预计阅读时间需要13分钟 发布时间: 2021-10-15 共167人阅读

Python 30 天 - 第 28 天 - 机器学习和数据科学 II

本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接

今天我探索了Scikit-Learn库并创建了一个笔记本项目来回顾一些基础知识并尝试创建一个机器学习模型。Scikit-Learn 是一个庞大的库,需要大量的练习和探索才能掌握它。我按照一些教程和文章尝试构建一个简单的分类器模型,只是为了弄清楚它是如何工作的。这对我来说看起来有点吓人,但我决定在 Jupyter Notebook 中创建一个基本工作流程,以便在我决定深入研究 ML 和数据科学领域时将其用作参考。

Scikit-Learn 是一个流行的机器学习 Python 库。Scikit-Learn 可以处理提供给它的数据并创建机器学习模型来学习数据中的模式并使用其工具进行预测。

为什么是 Scikit-learn?

  • 建立在 numpy 和 matplotlib 库之上
  • 有大量的内置机器学习模型
  • 许多评估机器学习模型的方法
  • 易于理解且设计良好的 API

通常,机器学习可能会有点让人不知所措,因为它涉及复杂的算法和统计数据来分析数据。Scikit-learn 抽象了这种复杂性,使构建模型和训练模型变得容易,而无需了解太多数学和统计学知识。

这是我今天创建的笔记本。Github 存储库的链接在这里

scikit-learn 库的基础知识

本笔记本涵盖了令人惊叹的 scikit-learn Python 库的一些基础知识。本笔记本中列出了该库的一些重要用例,可用作备忘单以供参考。

涵盖的一些主题是:

  • 准备好数据
  • 为特定问题选择合适的算法/估计器
  • 拟合模型/算法以使用它对数据进行预测
  • 评估模型
  • 改进模型
  • 保存加载训练好的模型

准备好数据

该项目使用的数据将是可从 https://www.kaggle.com/ronitf/heart-disease-uci 获得的心脏病数据集

import pandas as pd    
import numpy as np    
heart_disease = pd.read_csv('data/heart.csv')    
heart_disease.head()    
<div class="table-wrapper">    
<table border="1" class="dataframe">    
  <thead>    
    <tr style="text-align: right;">    
      <th></th>    
      <th>age</th>    
      <th>sex</th>    
      <th>cp</th>    
      <th>trestbps</th>    
      <th>chol</th>    
      <th>fbs</th>    
      <th>restecg</th>    
      <th>thalach</th>    
      <th>exang</th>    
      <th>oldpeak</th>    
      <th>slope</th>    
      <th>ca</th>    
      <th>thal</th>    
      <th>target</th>    
    </tr>    
  </thead>    
  <tbody>    
    <tr>    
      <th>0</th>    
      <td>63</td>    
      <td>1</td>    
      <td>3</td>    
      <td>145</td>    
      <td>233</td>    
      <td>1</td>    
      <td>0</td>    
      <td>150</td>    
      <td>0</td>    
      <td>2.3</td>    
      <td>0</td>    
      <td>0</td>    
      <td>1</td>    
      <td>1</td>    
    </tr>    
    <tr>    
      <th>1</th>    
      <td>37</td>    
      <td>1</td>    
      <td>2</td>    
      <td>130</td>    
      <td>250</td>    
      <td>0</td>    
      <td>1</td>    
      <td>187</td>    
      <td>0</td>    
      <td>3.5</td>    
      <td>0</td>    
      <td>0</td>    
      <td>2</td>    
      <td>1</td>    
    </tr>    
    <tr>    
      <th>2</th>    
      <td>41</td>    
      <td>0</td>    
      <td>1</td>    
      <td>130</td>    
      <td>204</td>    
      <td>0</td>    
      <td>0</td>    
      <td>172</td>    
      <td>0</td>    
      <td>1.4</td>    
      <td>2</td>    
      <td>0</td>    
      <td>2</td>    
      <td>1</td>    
    </tr>    
    <tr>    
      <th>3</th>    
      <td>56</td>    
      <td>1</td>    
      <td>1</td>    
      <td>120</td>    
      <td>236</td>    
      <td>0</td>    
      <td>1</td>    
      <td>178</td>    
      <td>0</td>    
      <td>0.8</td>    
      <td>2</td>    
      <td>0</td>    
      <td>2</td>    
      <td>1</td>    
    </tr>    
    <tr>    
      <th>4</th>    
      <td>57</td>    
      <td>0</td>    
      <td>0</td>    
      <td>120</td>    
      <td>354</td>    
      <td>0</td>    
      <td>1</td>    
      <td>163</td>    
      <td>1</td>    
      <td>0.6</td>    
      <td>2</td>    
      <td>0</td>    
      <td>2</td>    
      <td>1</td>    
    </tr>    
  </tbody>    
</table>    
</div>  

目的是根据上述数据预测患者是否患有心脏病。目标列确定结果,其他列称为特征。

# Create Features Matrix (X)    
X = heart_disease.drop('target', axis=1)    
    
# Create Labels (Y)    
y = heart_disease['target']  

RandomForestClassifier

对于这个问题,我们将使用 RandomForestClassifier 模型形式 sklearn,这是一个分类机器学习模型。

from sklearn.ensemble import RandomForestClassifier    
clf = RandomForestClassifier()    
clf.get_params() # lists the hyperparameters    
   
{'bootstrap': True,    
 'ccp_alpha': 0.0,    
 'class_weight': None,    
 'criterion': 'gini',    
 'max_depth': None,    
 'max_features': 'auto',    
 'max_leaf_nodes': None,    
 'max_samples': None,    
 'min_impurity_decrease': 0.0,    
 'min_impurity_split': None,    
 'min_samples_leaf': 1,    
 'min_samples_split': 2,    
 'min_weight_fraction_leaf': 0.0,    
 'n_estimators': 100,    
 'n_jobs': None,    
 'oob_score': False,    
 'random_state': None,    
 'verbose': 0,    
 'warm_start': False}  

将模型拟合到训练数据

在这一步中,模型被拆分为训练和测试数据

# fit the model to data    
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)     
# Means 20% of the data will be used as testing data    
clf.fit(X_train, y_train);    
  
# make prediction    
y_label = clf.predict(np.array([0,2,3,4]))    
   
y_preds = clf.predict(X_test)    
y_preds    
   
array([1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0,    
       1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0,    
       1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1], dtype=int64)    
y_test.head()    
  
72     1    
116    1    
107    1    
262    0    
162    1    
Name: target, dtype: int64    

评估模型

在这一步中,模型在训练数据和测试数据上进行评估

clf.score(X_train, y_train)    
   
1.0    
   
clf.score(X_test, y_test)  

0.7704918032786885

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score    
    
print(classification_report(y_test, y_preds))    
   
           precision    recall  f1-score   support    
    
        0       0.77      0.71      0.74        28    
        1       0.77      0.82      0.79        33    
    
 accuracy                           0.77        61    
macro avg       0.77      0.77      0.77        61    
ghted avg       0.77      0.77      0.77        61    
   
print(confusion_matrix(y_test, y_preds))    
   
[[20  8]    
 [ 6 27]]    
   
print(accuracy_score(y_test, y_preds))   

0.7704918032786885

改进模型

此步骤涉及改进模型以获得更准确的结果

# Try different amount of n_estimators    
np.random.seed(42)    
for i in range(1, 100, 10):    
    print(f'Trying model with {i} estimators')    
    clf = RandomForestClassifier(n_estimators=i).fit(X_train, y_train)    
    print(f'Model accuracy on test set: {clf.score(X_test, y_test) * 100:.2f}%')    
    print('')    
Trying model with 1 estimators    
   Model accuracy on test set: 72.13%    
       
   Trying model with 11 estimators    
   Model accuracy on test set: 83.61%    
       
   Trying model with 21 estimators    
   Model accuracy on test set: 78.69%    
       
   Trying model with 31 estimators    
   Model accuracy on test set: 78.69%    
       
   Trying model with 41 estimators    
   Model accuracy on test set: 75.41%    
       
   Trying model with 51 estimators    
   Model accuracy on test set: 75.41%    
       
   Trying model with 61 estimators    
   Model accuracy on test set: 75.41%    
       
   Trying model with 71 estimators    
   Model accuracy on test set: 73.77%    
       
   Trying model with 81 estimators    
   Model accuracy on test set: 73.77%    
       
   Trying model with 91 estimators    
   Model accuracy on test set: 75.41%  

保存模型并加载它

将使用 Python 中的 pickle 库来保存模型

import pickle    
    
pickle.dump(clf, open('random_forest_model_1.pkl', 'wb'))    
    
#load the model    
loaded_model = pickle.load(open('random_forest_model_1.pkl','rb'))    
loaded_model.score(X_test, y_test)  

0.7540983606557377

这就是今天的全部内容。由于机器学习和数据科学本身就是一片海洋,我决定更详细地研究它,并在对其工具和概念更加熟练后,以博客文章和项目的形式分享我的经验。对于此挑战的其余两个部分,我想探索诸如使用 Selenium 使用 Python 进行自动化测试之类的领域,并创建另一篇关于 Python 资源编译的文章。


慕源网 » Python 30 天 – 第 28 天 – 机器学习和数据科学 II

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录