当前位置:   article > 正文

机器学习的入门教学-scikit-learn_scikit-learn教程

scikit-learn教程

  一、概念分析

        很多人好奇机器学习是什么,个人理解机器学习就是人工智能的前身,有许多机器学习的模型塑造才能有更符合实际的人工智能技术应用。机器学习的基础就是深度学习,让计算机深度学习人的思维方式,形成人的思维模式,做人期望完成的事情。比如人脸识别,就是用大量的面部识别建模形成的模型,对比人的五官进行核验,通过才能进行操作。

        

 人工智能两个核心方法就是机器学习、深度学习。

机器学习:使用算法来解析数据,从中学习,然后对真实世界的事件做出决策和预测。例:垃圾邮件检测。

深度学习: 一种实现机器学习的方法。模仿神经网络建立模型,进行深度数据分析。比如人脸识别,自动驾驶

机器学习的三大类别:监督式学习(垃圾邮件检测、房价预测)、非监督式学习(数据聚类、新闻邮件推送)、强化学习(强化学习是一种通过交互的目标导向学习方法,旨在找到连续时间序列的最优策略例如AlphaGo)。

二、开发环境搭建

2.1配置环境

python语言、scikit-learn 模块、Anaconda、jupyter nootbook、panda模块 numpy模块、机器学习环境的部署

通过一张简图了解一下python语言的优缺点,任何语言都有自己的优势,也有自己的劣势。python语言是对面对象语言,和C语言其他语言不同,面向对象开发好比建设一个车子,需要车架、发动机、变数器、底盘、轮胎还有其他座椅操控台,pyhon语言开发可以设置每个零部件,组装一台汽车就可以调用一个零部件使用。每个零部件就是相当于python的一个模块,可以随意调用

 scikit-learn 模块

 简单安装、易导入,经常使用与深度学习,用于机器学习的案例使用。使用方法:可以在Anacanda中安装,或者使用官方API如下:

scikit-learn: machine learning in Python — scikit-learn 1.1.1 documentationhttps://scikit-learn.org/stable/

pandas模块

用于读取office中word、excel、ppt文件的模块,可以在Anaconda安装库中安装,或者用Anaconda终端器中安装(这不细讲了)

pandas - Python Data Analysis Library

numpy模块

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPyhttp://www.numpy.org/

 jupyter nootbook工具包

 下载Anaconda就可以正常使用了,在Anaconda(Anaconda可以看我主页)工具界面就可以选择。

登录后的效果:

2.2安装步骤:

python环境可以不安装,直接在Anaconda中安装时在选择python环境勾选就行,安装完毕以后可以新建一个开发环境,相当于一个项目库里面进行调试。

scikit-learn、pandas、numpy模块包可以在Anaconda界面安装或者用指令安装都可以。

 下面是指令安装界面:(老师我安装过了,结果呈现已经安装)

 

2.3实战环节:

1、测试几个模块包有没有安装成功

新建一个python3的模板

 使用import 指令导入,就知道有没有安装成功。

三、开发实战环节:

 3.1数据预处理操作

理论解析:

 

 

机器学习实现之模型训练 Iris数据加载

  1. #通过sklearn自带数据包加载iris数据
  2. from sklearn import datasets
  3. iris = datasets.load_iris()
  4. #数据样本和结果样本分别赋值在“x”,"y"
  5. X = iris.data
  6. y = iris.target

注意数据的维度要相同,要不然后期数据建模会因为索引不同而影响结果。

  1. #确定样本和输出数据维度
  2. print(X.shape)
  3. print(y.shape)

#使用scikit-learn建模四步骤

1、调用需要使用的模型类 2、模型初始化(创建一个模型实例) 3、模型训练 4、模型预测

 -分类问题是对应结果为类别(非连续性)的监督式学习问题 -每个预测的数值即是结果数据(或称为:目标、输出、标签) 使用scikit-learn进行数据处理的四个关键点 1、区分属性数据与结果数据 2、属性数据与结果数据是可量化的 3、运算过程中,属性数据与结果数据的类型都是numpy数组 4、属性数据和结果数据的维度是相同的。

  1. #X输入数据赋值,Y输出数据赋值。
  2. x=iris.data
  3. y=iris.target
  4. print('x值:',x)
  5. print('y值:',y)

 

 knn算法计算

 

 

 

 

 机器学习实现之模型训练 Iris数据加载

  1. #通过sklearn自带数据包加载iris数据
  2. from sklearn import datasets
  3. iris = datasets.load_iris()
  4. #数据样本和结果样本分别赋值在“x”,"y"
  5. X = iris.data
  6. y = iris.target

#使用scikit-learn建模四步骤 1、调用需要使用的模型类 2、模型初始化(创建一个模型实例) 3、模型训练 4、模型预测

  1. #模型调用,KNeighborsClassifier是k值
  2. from sklearn.neighbors import KNeighborsClassifier
  3. knn = KNeighborsClassifier(n_neighbors=1)
  4. print (knn)

  1. knn.fit(X,y)#模型训练
  2. knn.predict([[1,2,3,4]])#预测结果以numpy的形式返回

 

 

3.2机器学习实现模型评估一

 

 

 

实操部分:

 3.3机器学习实现之模型评估(二)

 

 

 

 

 

 

 

 

 

 

 3.4机器学习实现之模型评估(三)

换一组数据进行深度学习演示,先看训练的数据HR_comma_sep.csv表

代码实操部分:

 

 

总结:机器深度学习可以把数据集进行深度建模,以相应的算法进行测试和评估。上图模型训练的原理使用KNN模型、KNN模型适用寻找knn的值相等的数据集进行模型训练。模型评估使用准确率、数据分离和逻辑回归、混淆矩阵适用找寻数据中存在准确性、回归性、特异性。我们根据使用实际的业务需求范围进行技术选型,后期人工智能学习的范围还很广,深度还有。路漫漫兮,努力学习。

 完整的代码:

训练模型一:

  1. 机器学习实现之模型评估(二)
  2. 目录 ·逻辑回归模型 ·皮马印第安人糖尿病数据集 ·使用准确率进行模型评估的局限性 ·混淆矩阵、模型衡量指标及其意义
  3. 皮马印第安人糖尿病数据集
  4. 基于数据集中包括的某些诊断测量来诊断性地预测患者有糖尿病 输入变量包括:独立变量包括患者的怀孕次数,葡萄糖量,血压,皮皱厚度, 体重指数,胰岛素水平,糖尿病谱系功能,年龄。 输出结果:是否患有糖尿病 数据来源:Pima Indians Diabetes dataset
  5. 任务:通过怀孕次数、胰岛素水平、体重指数、年龄四个特征预测是否患有糖尿病
  6. #数据预处理
  7. import pandas as pd
  8. path = 'Pima Indians Diabetes Database/diabetes.csv'
  9. pima = pd.read_csv(path)
  10. pima.head()
  11. Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
  12. 0 6 148 72 35 0 33.6 0.627 50 1
  13. 1 1 85 66 29 0 26.6 0.351 31 0
  14. 2 8 183 64 0 0 23.3 0.672 32 1
  15. 3 1 89 66 23 94 28.1 0.167 21 0
  16. 4 0 137 40 35 168 43.1 2.288 33 1
  17. #X,y赋值
  18. feature_names = ['Pregnancies','Insulin','BMI','Age']
  19. X = pima[feature_names]
  20. y = pima.Outcome
  21. #确定维度
  22. print(X.shape)
  23. print(y.shape)
  24. (768, 4)
  25. (768,)
  26. #数据分离
  27. from sklearn.model_selection import train_test_split
  28. X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)#将数组或矩阵分割成随机的序列和测试子集,random_state:int或RandomState实例,默认为None
  29. #控制在应用分割之前应用于数据的变换。在多个函数调用之间传递可重复输出的int。看到术语表
  30. #模型训练
  31. from sklearn.linear_model import LogisticRegression
  32. logreg = LogisticRegression()
  33. logreg.fit(X_train,y_train)
  34. LogisticRegression()
  35. #测试数据集结果预测
  36. y_pred = logreg.predict(X_test)
  37. print (y_pred)
  38. [0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
  39. 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
  40. 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0
  41. 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
  42. 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0
  43. 0 0 0 0 0 0 0]
  44. #使用准确率进行评估
  45. from sklearn import metrics
  46. print(metrics.accuracy_score(y_test,y_pred))
  47. 0.6770833333333334
  48. 预测准确率的局限性:无法真是反应模型针对各个分类的预测准确度 任务:计算并对比预测模型预测准确率 空准确率:当模型总是预测比例较高的类别,其预测准确率的数值
  49. #确认正负样本数据量
  50. y_test.value_counts()
  51. 0 130
  52. 1 62
  53. Name: Outcome, dtype: int64
  54. #1的比例
  55. y_test.mean()
  56. 0.3229166666666667
  57. #0的比例
  58. 1 - y_test.mean()
  59. 0.6770833333333333
  60. #空准确率
  61. max(y_test.mean(),1-y_test.mean())
  62. 0.6770833333333333
  63. 结论: 分类准确率可以方便的用于衡量模型的整体预测结果,但无法反应细节信息,具体表现在 ·没有体现数据的实际分布情况 ·没有体现模型错误预测的类型
  64. 混淆矩阵 又称作误差矩阵,用于衡量分类算法的准确程度 image-2.png
  65. 名词解释 ·True Positives(TP):预测准确、实际为正样本的数量(实际为1,预测为1) ·True Negatives(TN):预测准确、实际为负样本的数量(实际为0,预测为0) ·Fales Positives(FP):预测错误、实际为负样本的数量(实际为0,预测为1) ·Fales Negatives(FN):预测错误、实际为正样本的数量(实际为1,预测为0
  66. #计算并展示混淆矩阵
  67. print(metrics.confusion_matrix(y_test,y_pred))
  68. [[114 16]
  69. [ 46 16]]
  70. image-3.png
  71. #展示部分实际结果与预测结果(25组)
  72. print("true:",y_test.values[0:25])
  73. print("pred:",y_pred[0:25])
  74. true: [1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0]
  75. pred: [0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
  76. #四个因子赋值
  77. confusion = metrics.confusion_matrix(y_test,y_pred)
  78. TN = confusion[0,0]
  79. FP = confusion[0,1]
  80. FN = confusion[1,0]
  81. TP = confusion[1,1]
  82. print(TN,FP,FN,TP)
  83. 114 16 46 16
  84. image.png
  85. 混淆矩阵指标
  86. 准确率:整体样本中,预测正确样本数的比例 ·Accuracy =(TP +TN)/(TP+TN+FP+FN)
  87. accuracy = (TP +TN)/(TP+TN+FP+FN)
  88. print(accuracy)
  89. print(metrics.accuracy_score(y_test,y_pred))
  90. 0.6770833333333334
  91. 0.6770833333333334
  92. 错误率:整体样本中,预测错误样本的比例 ·Misclassification Rate = (FP + FN)/(TP + TN + FP +FN)
  93. mis_rate =(FP + FN)/(TP + TN + FP +FN)
  94. print(mis_rate)
  95. print(1- metrics.accuracy_score(y_test,y_pred))
  96. 0.3229166666666667
  97. 0.32291666666666663
  98. 灵敏度(召回率):正样本中,预测正确的比例 ·Sensitivity = Recall = TP/(TP + FN)
  99. recall = TP/(TP + FN)
  100. print(recall)
  101. 0.25806451612903225
  102. 特异度:负样本中,预测正确的比例
  103. ·Specificity = TN/(TN + FP)
  104. specificity = TN/(TN + FP)
  105. print(specificity)
  106. 0.8769230769230769
  107. 精准率:预测结果为正的样本中,预测正确的比例 ·Precision = TP/(TP + FP)
  108. precision = TP/(TP + FP)
  109. print(precision)
  110. 0.5
  111. F1分数:综合Precision和Recall的一个判断指标 ·F1 Score = 2*Precision X Recall/(Precision + Recall)
  112. F1_score = 2*precision * recall/(precision + recall)
  113. print(F1_score)
  114. 0.3404255319148936
  115. 结论: ·分类任务重,相比单一的预测准确率,混淆矩阵提供了更全面的模型评估信息 ·通过混淆矩阵,我们可以计算出多样的模型表现衡量指标,从而更好地选择模型 哪个衡量指标更加关键呢? ·衡量指标的选择取决于应用场景 ·垃圾邮件检测【(正样本为“垃圾邮件”):希望普通邮件(负样本)不要被判断为垃圾邮件(正样本),需要关注精准度,希望判断为垃圾邮件的样本都是判断正确的;还需要关注召回率,希望所有垃圾邮件尽可能判断出来】 ·异常交易检测:(正样本为“异常交易”):希望所有的异常交易都被检测到,即判断为正常交易中可能不存在异常交易,需要关注特异度

训练模型二:

  1. #导入数据,用pandas读取数据
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. data = pd.read_csv('HR_comma_sep.csv')
  5. data.info()
  6. <class 'pandas.core.frame.DataFrame'>
  7. RangeIndex: 14999 entries, 0 to 14998
  8. Data columns (total 10 columns):
  9. # Column Non-Null Count Dtype
  10. --- ------ -------------- -----
  11. 0 satisfaction_level 14999 non-null float64
  12. 1 last_evaluation 14999 non-null float64
  13. 2 number_project 14999 non-null int64
  14. 3 average_montly_hours 14999 non-null int64
  15. 4 time_spend_company 14999 non-null int64
  16. 5 Work_accident 14999 non-null int64
  17. 6 left 14999 non-null int64
  18. 7 promotion_last_5years 14999 non-null int64
  19. 8 jobs 14999 non-null object
  20. 9 salary 14999 non-null object
  21. dtypes: float64(2), int64(6), object(2)
  22. memory usage: 1.1+ MB
  23. data.shape
  24. (14999, 10)
  25. data.columns
  26. Index(['satisfaction_level', 'last_evaluation', 'number_project',
  27. 'average_montly_hours', 'time_spend_company', 'Work_accident', 'left',
  28. 'promotion_last_5years', 'jobs', 'salary'],
  29. dtype='object')
  30. data.head(10)
  31. satisfaction_level last_evaluation number_project average_montly_hours time_spend_company Work_accident left promotion_last_5years jobs salary
  32. 0 0.38 0.53 2 157 3 0 1 0 sales low
  33. 1 0.80 0.86 5 262 6 0 1 0 sales medium
  34. 2 0.11 0.88 7 272 4 0 1 0 sales medium
  35. 3 0.72 0.87 5 223 5 0 1 0 sales low
  36. 4 0.37 0.52 2 159 3 0 1 0 sales low
  37. 5 0.41 0.50 2 153 3 0 1 0 sales low
  38. 6 0.10 0.77 6 247 4 0 1 0 sales low
  39. 7 0.92 0.85 5 259 5 0 1 0 sales low
  40. 8 0.89 1.00 5 224 5 0 1 0 sales low
  41. 9 0.42 0.53 2 142 3 0 1 0 sales low
  42. data.describe()
  43. satisfaction_level last_evaluation number_project average_montly_hours time_spend_company Work_accident left promotion_last_5years
  44. count 14999.000000 14999.000000 14999.000000 14999.000000 14999.000000 14999.000000 14999.000000 14999.000000
  45. mean 0.612834 0.716102 3.803054 201.050337 3.498233 0.144610 0.238083 0.021268
  46. std 0.248631 0.171169 1.232592 49.943099 1.460136 0.351719 0.425924 0.144281
  47. min 0.090000 0.360000 2.000000 96.000000 2.000000 0.000000 0.000000 0.000000
  48. 25% 0.440000 0.560000 3.000000 156.000000 3.000000 0.000000 0.000000 0.000000
  49. 50% 0.640000 0.720000 4.000000 200.000000 3.000000 0.000000 0.000000 0.000000
  50. 75% 0.820000 0.870000 5.000000 245.000000 4.000000 0.000000 0.000000 0.000000
  51. max 1.000000 1.000000 7.000000 310.000000 10.000000 1.000000 1.000000 1.000000
  52. #确定X,y的赋值,读取维度,查看行数和列数是多少。
  53. feature_name=['Work_accident','last_evaluation','satisfaction_level','average_montly_hours']
  54. X = data[feature_name]
  55. y = data.left
  56. print (X.shape)
  57. print (y.shape)
  58. (14999, 4)
  59. (14999,)
  60. #数据分离
  61. from sklearn.model_selection import train_test_split
  62. X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
  63. #模型训练
  64. from sklearn.linear_model import LogisticRegression
  65. logreg = LogisticRegression()
  66. logreg.fit(X_train,y_train)
  67. LogisticRegression()
  68. #测试数据集结果预测
  69. y_pred = logreg.predict(X_test)
  70. print(y_pred)
  71. [0 0 0 ... 0 0 0]
  72. #准确率进行评估
  73. from sklearn import metrics
  74. print (metrics.accuracy_score(y_test,y_pred))
  75. 0.7722666666666667
  76. #对测试数据进行建模预测
  77. # from sklearn.linear_model import LogisticRegression
  78. # logreg = LogisticRegression()
  79. # logreg.fit(X_test,y_test)
  80. # y_pred = logreg.predict(X_test)
  81. # print (y_pred)
  82. # from sklearn import metrics
  83. # print(metrics.accuracy_score(y_test,y_pred))
  84. #结果:使用测试数据进行建模训练,预测的结果的准确性要高很多了。
  85. #确定正负样本数量
  86. y_test.value_counts()
  87. 41
  88. 0 2881
  89. 1 869
  90. Name: left, dtype: int64
  91. #1比例
  92. y_test.mean()
  93. 0.23173333333333335
  94. #0的比例
  95. 1 - y_test.mean()
  96. 0.7682666666666667
  97. #空准确率
  98. max(y_test.mean(),1-y_test.mean())
  99. 0.7682666666666667
  100. print (metrics.confusion_matrix(y_test,y_pred))
  101. [[2678 203]
  102. [ 651 218]]
  103. print ("true:",y_test.values[0:25])
  104. print ("pred:",y_pred[0:25])
  105. true: [1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0]
  106. pred: [0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0]
  107. confusion = metrics.confusion_matrix(y_test,y_pred)
  108. TN = confusion[0,0]
  109. FP = confusion[0,1]
  110. FN = confusion[1,0]
  111. TP = confusion[1,1]
  112. print(TN,FP,FN,TP)
  113. 2678 203 651 218
  114. #准确率
  115. accuracy = (TP +TN)/(TP+TN+FP+FN)
  116. print(accuracy)
  117. print(metrics.accuracy_score(y_test,y_pred))
  118. 0.7722666666666667
  119. 0.7722666666666667
  120. #错误率
  121. mis_rate =(FP + FN)/(TP + TN + FP +FN)
  122. print(mis_rate)
  123. print(1- metrics.accuracy_score(y_test,y_pred))
  124. 0.22773333333333334
  125. 0.22773333333333334
  126. #召回率
  127. recall = TP/(TP + FN)
  128. print(recall)
  129. 0.2508630609896433
  130. #特异度
  131. specificity = TN/(TN + FP)
  132. print(specificity)
  133. 0.9295383547379382
  134. #精准度
  135. precision = TP/(TP + FP)
  136. print(precision)
  137. 0.517814726840855
  138. #F1分数:综合Precision和Recall的一个判断指标
  139. F1_score = 2*precision * recall/(precision + recall)
  140. print(F1_score)
  141. 0.337984496124031

参考网站:课程总结与人工智能实战提升,人工智能入门:Python实现机器学习教程-慕课网

kaggel竞赛之员工离职分析_二郎银的博客-CSDN博客_kaggle员工离职数据集

从小白到进阶 | 10个适合数据人练手的Kaggle数据集_CDA·数据分析师的博客-CSDN博客_kaggle数据集汇总

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/368912
推荐阅读
相关标签
  

闽ICP备14008679号