前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(震惊)机电学生竟然帮助建筑同学做人工智能大作业!

(震惊)机电学生竟然帮助建筑同学做人工智能大作业!

作者头像
UDM Lab
发布2020-04-20 15:56:39
4320
发布2020-04-20 15:56:39
举报
文章被收录于专栏:UDM LabUDM Lab

本来说要让我去搞人工智能大作业,我一开始是拒绝的,因为我作为一个传统的机械电子工程专业的学生,怎么可以不务正业呢?同时感觉到现在建筑学教育也开始这么的浮夸了么,让一群没有见过代码的孩子去写机器学习,真的是过分!不过看到J同学苦苦哀求的眼神,心想还是帮人一把,毕竟救人一命胜造七级浮屠啊,然后便答应了下来。

但是开始做的之后,突然发现人家没学过python,我自己专业也没教过啊?

But凭借我多年自己倒腾的经验,感觉糊弄一个作业,应该是不再话下,不过我想应该也是有蛮多人跟我一样,并没有什么经验,但是还是想尝试一下先进的机器学习,所以便把自己的爬坑经历和学习路程分享一下,希望能够有所有帮助。


什么是sklearn

sklearn(全名scikit-learn,sklearn是包名)是一个python的第三方提供强有力的机器学习库,涵盖了了从数据预处理到模型训练的各个方面,能够极大的减少我们的工作量,快速方便的开展机器学习的工作。

官方网址:https://scikit-learn.org/

安装sklearn

如果已经安装好了numpyscipy,可以直接在控制台中输入

代码语言:javascript
复制
pip install sklearn

如果没有,则需要先安装numpy和scipy,方法同上

代码语言:javascript
复制
pip install numpy

如果之前并没有一点python经验请看? 配置python环境与pycharm:https://blog.csdn.net/ling_mochen/article/details/79314118

跑一个sample

运行一下这个示例代码,这个代码是加载了sklearn自带的iris的数据集,由Fisher在1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。通过决策树算法构建起对其分类的模型。

代码语言:javascript
复制
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
iris = load_iris()#加载数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.3)#划分训练集与测试集
clf = DecisionTreeClassifier()#采用决策树模型
clf.fit(x_train,y_train)#训练模型
predict_target = clf.predict(x_test)#加载测试集
print(sum(predict_target == y_test)) #预测结果与真实结果比对
print(metrics.classification_report(y_test,predict_target))
print(metrics.confusion_matrix(y_test,predict_target))#输出混淆矩阵
L1 = [n[0] for n in x_test]
L2 = [n[1] for n in x_test]
plt.scatter(L1,L2, c=predict_target,marker='x')
plt.title('DecisionTreeClassifier')
plt.show()

如果顺利运行则会plot出来这样一个图片,那么这也意味着你已经准备就绪,开始尝试处理你的问题了。 #更多关于鸢尾花这个数据集的例子:https://zhuanlan.zhihu.com/p/31785188* * #建议上手操作一遍

开始尝试处理你的问题吧

首先在我看来,第一步要明确的事情就是要明确自己要做什么。比如我想通过一堆数据,去预测房价,天气,还是要进行分类,做非黑即白的判定。所以整个逻辑应该是这样的 1,明确自己的问题 2,获取合适的数据集 3,选取合适的算法,构建自己的模型

问题的分类

问题可以比较简单的分成两类,一个是回归(Regression),另一个是分类(classification) 形象的说,明天下午不下雨,是一个分类问题,但是明天多少度,就是要给回归问题了。 关键在于输出的是一个连续还是离散的结果(#这种说法在数学上不严谨)。

所以回归模型可以用来预测房价、天气等,分类模型可以用来做一些判断,比如银行的信用评级、物品分类、手写数字判断,图像识别什么的。

参考:分类与回归区别是什么? - Chevalier Meirtz的回答 - 知乎

https://www.zhihu.com/question/21329754/answer/149416198

数据集、训练集、测试集

数据集

当明确的问题之后,就需要去获得数据集(dataset)了。如果把机器学习的过程比作奔跑的列车,那么数据集就是用来支撑行驶的燃料,如果燃料的品质越好,那么列车运行就会更加高效,如果燃料充足,那么列车才能行驶到远方的终点。所以说数据集是至关重要的一部分。 获得数据集的方法最简单的就是去网络上下载,有很多免费的数据集在网络共享,不过有些数据并不是那么方便就能够获取的,所以这个时候你可能就需要去网络上通过爬虫去爬取,或者就是去自建数据集。

一些免费的数据集:https://segmentfault.com/a/1190000014230303

那么一个完整的数据集需要包含哪些内容呢? 在sklearn中自带的数据集中有以下几个部分 data:特征数据数组,样本的特征参数 target:标签数组,比如黑猫白猫这种标签 DESCR:数据描述 featurenames:特征名 targetnames:标签名 当然,在自建数据集上面,还是很有学问和技巧。

机器学习新手在数据集上常犯的6个错误及避免方法:https://zhuanlan.zhihu.com/p/37807352

训练集与测试集

在开始训练模型之前,通常还是需要将数据集拆分成训练集和测试集,训练集是用与训练模型,而测试集则是用来检测模型的精确度,但是数据集本身是有限的,但是控制训练集与数据集的比例却是需要考虑的。 sklearn里面提供有直接的方法用于划分数据集 可以通过traintestsplit进行划分

代码语言:javascript
复制
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()#加载数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.3)#划分训练集与测试集
print(len(x_train)) #显示测试集数量
print(len(x_test)) #显示测试集数量

当然这也仅仅只是最为基础的划分方法,如果在数据集的划分上面需要优化的话,可以参考下面?

更加复杂的方法:https://blog.csdn.net/Alinawly/article/details/80822084

训练模型

完成了前面的准备工作之后,就可以尝试一下训练模型了,实际上在配置好了训练集与测试集之后,使用sklearn进行模型训练只有两句话

代码语言:javascript
复制
clf = DecisionTreeClassifier()#采用决策树模型
clf.fit(x_train,y_train)#训练模型

这么简单操作,模型就训练好了,得到一个模型很简单,但是得到一个好的可以满足的需求的就需要多吃尝试了。

如何选择合适的模型

前面的问题类型也讲了大致分为几类,回归问题与分类问题,不同的问题也会对应着不同的模型。

这个是官网上面给出的一个引导选择合适模型的map,可以根据自己的实际问题需求,进行选择对应的模型。https://scikit-learn.org/stable/tutorial/machinelearningmap/index.html 同时官网上面也给出了很多例子可供参考,也都包含了示例代码。

链接:http://scikit-learn.org/stable/auto_examples/index.html 如果还是比较困惑,那可以参考机器之心翻译的一个算法对比?

https://www.jiqizhixin.com/articles/2017-05-20-3

模型调参

当选择完模型之后,可以对选取的模型进行进一步的调参,以获取更加优质的模型。就以SVM模型为例,查阅官方手册,SVR模型内包含如下一堆参数(标红)class *sklearn.svm.SVR(kernel=’rbf’, *degree=3, gamma=’auto_deprecated’, coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)

可以看到有非常多的参数可以调整,每个参数背后都有具体对应意义,所以一般来说并不需要对所有的参选进行调整,以下是通过遍历调节惩罚系数来进行调参,用以获取更优的参数设定

代码语言:javascript
复制
for c in c_range:
    svr = SVR(C=c,gamma=0.1,kernel='rbf')
    svr.fit(X_train_scaler,Y_train)
    c_scores.append(svr.score(X_test_scaler, Y_test))

在实际操作过程中,除去这种比较粗暴的调参方式,也可以通过grid_search 等别的方法进行调参。目的都是为了获取更加精确的模型。

python 机器学习中模型评估和调参:https://www.cnblogs.com/jingsupo/p/9865464.html

#sklearn决策树分类器使用(网格搜索+交叉验证)https://www.jianshu.com/p/3183dd02d579

python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法。https://blog.csdn.net/qq_36613615/article/details/83037523

完整代码如下,代码主要功能是通过遍历C来挑选一个更有的svr模型用以预测波士顿房价。

代码语言:javascript
复制
import sklearn.datasets as datasets
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

'''载入数据集'''
Boston = datasets.load_boston()
# print(Boston.feature_names)
X = Boston.data   #shape:(506, 13)
Y = Boston.target   #shape:(506,)
X_train,X_test,Y_train,Y_test= train_test_split(X,Y,random_state=8)

'''数据集预处理'''
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaler = scaler.transform(X_train)
X_test_scaler = scaler.transform(X_test)

# '''训练模型'''
# from sklearn.svm import SVR
# svr = SVR(kernel='rbf')
# svr.fit(X_train_scaler,Y_train)
# print('训练集得分:',svr.score(X_train_scaler,Y_train))
# print('测试集得分:',svr.score(X_test_scaler,Y_test))

from sklearn.svm import SVR
c_range = range(1,101,5)
c_scores = []

for c in c_range:
    svr = SVR(C=c,gamma=0.1,kernel='rbf')
    svr.fit(X_train_scaler,Y_train)
    c_scores.append(svr.score(X_test_scaler, Y_test))

C_best = c_range[c_scores.index(max(c_scores))]
svr_best = SVR(C=C_best,gamma=0.1,kernel='rbf')
svr_best.fit(X_train_scaler,Y_train)
svr_final_score=svr_best.score(X_test_scaler,Y_test)
svr_result = svr_best.predict(X_test_scaler)
print('score:',svr_final_score)
'''SVR模型结果可视化绘图'''
#不同参数对模型准确率的影响
plt.figure()
plt.subplot(1,2,2)
plt.plot(np.arange(len(svr_result)), Y_test, 'go-', label='true value')
plt.plot(np.arange(len(svr_result)), svr_result, 'ro-', label='predict value')
plt.title('score: %f' % svr_final_score)
plt.legend()
#根据最优参数创建模型的预测结果
plt.subplot(1,2,1)
plt.plot(c_range, c_scores)
plt.scatter([C_best,],[max(c_scores),],s=50,color='b')
plt.title('c= %f' % C_best)
plt.xlabel('Value of C for SVR')
plt.ylabel('Testing Accuracy')
plt.show()

小结

我也只是非常笼统整理了一下sklearn的新手指南,也是自己学习过程的一个笔记,在自己没有解释清楚的地方也附加了很多链接用以进一步解释说明,希望能够有所帮助。在开始自己项目前,建议完完整整做一遍iris的分类与波士顿房价预测,这两个都是比较经典的案例。最后放一个比较新手向的视频教程,也是我看的最多的,里面也有很多其他的关于python的教程,强力推荐!!!

莫烦python sklearn视频教程

https://morvanzhou.github.io/tutorials/machine-learning/sklearn/

最后的最后

听说J同学最后好像还是比较顺利的交了差事,成绩也还看的过去哈哈哈,开学又有金拱门吃啦!不过我告诉J同学我要把这个过程分享出来之后,J同学比较羞愧,表示自己想想,也要写点啥,那就让我们期待一下吧?!

最最最最后

可能有很多ML的大佬会看到这篇写的非常蹩脚的学习笔记,如果有什么不对的地方就麻烦多多指教啦!万分感谢❤

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 UDM的神仙们 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是sklearn
  • 官方网址:https://scikit-learn.org/
  • 安装sklearn
  • 跑一个sample
    • 开始尝试处理你的问题吧
      • 问题的分类
      • 参考:分类与回归区别是什么? - Chevalier Meirtz的回答 - 知乎
        • 数据集、训练集、测试集
          • 数据集
          • 训练集与测试集
      • 一些免费的数据集:https://segmentfault.com/a/1190000014230303
      • 机器学习新手在数据集上常犯的6个错误及避免方法:https://zhuanlan.zhihu.com/p/37807352
      • 更加复杂的方法:https://blog.csdn.net/Alinawly/article/details/80822084
        • 训练模型
          • 如何选择合适的模型
          • 模型调参
          • 最后的最后
      • python 机器学习中模型评估和调参:https://www.cnblogs.com/jingsupo/p/9865464.html
      • python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法。https://blog.csdn.net/qq_36613615/article/details/83037523
      • 小结
      • 莫烦python sklearn视频教程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档