Py学习  »  Python

手把手教你学python第七课:数据分析和机器学习

与尔岩说 • 3 年前 • 391 次点击  

 快速高效学会python的终极奥义:过、抄、仿、改、调、看、练、创、悟


正文开始前,先碎碎念几句。

1、本文的数据分析和机器学习系列会分成很多讲,这块涉及到的包包非常多,从大家会在各种报导里看到的人脸识别到文本识别还有简单的数据挖掘,每一个研究内容都对应不同的包包和完全不同的理论体系,今天的文章介绍的是最基本的一个入门包包;


2、由于很多读者爸爸反映说不能翻墙然后单纯看公众号的内容可能没办法全部看懂,于是从youtube上扒下来了视频供大家使用,但是视频一个一个看完还是需要花比较长的时间的,后续我也会继续扒视频,丰富下前面讲的一些内容,这里的视频我都声明了转载,非常感谢data school的创始人的辛勤劳动~~


3、机器学习的内容汗牛充栋,入门只需要抄代码+调参,但是要学好很难,我也不是很专业,虽然确实是学这个的,但是实际经验有限,同时也是觉得对于金融数据这种高频数据来说,确实使用一些黑箱模型可能会有一些奇妙的效果出来,比如用图像识别模式识别来看股票的波段,还是有一些实用性的~



01



视频课程(从youtube上一个一个扒下来的)


  1. 机器学习入门

主要回答几个问题

  • 什么是机器学习?

  • 机器学习的两大类是什么?

  • 机器学习的例子有哪些?

  • 机器学习是如何“工作”的?

其实,总结下来,机器学习是一种数据处理手段,跟我们常用的一些模型差不多,但是大部分机器学习的模型是从大量的样本中获得数据的规律,然后机器自己去学习出一套适应的模型,用于预测或者分类某个结果~~


2、为机器学习设置Python:scikit learn和Jupyter


  • scikit learn的优点和缺点是什么?(一个好用的机器学习包包)

  • 如何安装scikit learn?

  • 我怎么使用Jupyter笔记本?

  • 学习Python有哪些好的资源?




3、开始使用scikit学习著名的iris数据集


  • 什么是著名的iris数据集,它与机器学习有什么关系?

  • 如何将iris数据集加载到sciket learn中?

  • 如何使用机器学习术语来描述数据集?

  • scikit learn对数据处理的四个关键要求是什么?


 由图中,可以看到库的算法主要有四类:分类,回归,聚类,降维。其中:

  • 常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees

  • 常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees

  • 常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN

  • 常用降维:LinearDiscriminantAnalysis、PCA


4、使用sciket learn训练机器学习模型


  • 什么是K近邻分类模型?

  • scikit学习中模型训练和预测的四个步骤是什么?

  • 如何将此模式应用于其他机器学习模型?



1、按任务类型分,机器学习模型可以分为回归模型、分类模型和结构化学习模型。回归模型又叫预测模型,输出是一个数值;分类模型又分为二分类模型和多分类模型,常见的二分类问题有垃圾邮件过滤,常见的多分类问题有文档自动归类;结构化学习模型的输出不再是一个固定长度的值,如图片语义分析,输出是图片的文字描述。

2、从方法的角度分,可以分为线性模型和非线性模型,线性模型较为简单,但作用不可忽视,线性模型是非线性模型的基础,很多非线性模型都是在线性模型的基础上变换而来的。非线性模型又可以分为传统机器学习模型,如SVM,KNN,决策树等,和深度学习模型。

3、按照学习理论分,机器学习模型可以分为有监督学习,半监督学习,无监督学习,迁移学习和强化学习。当训练样本带有标签时是有监督学习;训练样本部分有标签,部分无标签时是半监督学习;训练样本全部无标签时是无监督学习。



5、比较sciket learn中的机器学习模型


  • 如何选择用于监督学习任务的模型?

  • 如何为该模型选择最佳的调整参数?

  • 如何在样本外数据上估计模型的可能性能?



6、数据分析全套组件:pandas seaborn scikit learn


  • 如何使用pandas库将数据读入Python?

  • 如何使用seaborn库来可视化数据?

  • 什么是线性回归,它是如何工作的?

  • 如何在scikit learn中训练和解释线性回归模型?

  • 回归问题的一些评估指标是什么?

  • 如何选择要包含在模型中的功能?



7、参数调整、模型选择和功能选择的交叉验证


  • 使用train-test split进行模型评估的缺点是什么?

  • K-fold交叉验证如何克服这个限制?

  • 如何使用交叉验证来选择调整参数、在模型之间进行选择以及选择特性?

  • 交叉验证有哪些可能的改进?



8、高效搜索最佳调谐参数


  • 如何使用K-折叠交叉验证来搜索最佳调谐参数?

  • 如何提高这一过程的效率?

  • 如何一次搜索多个调优参数?

  • 在做出真正的预测之前,您如何处理这些调整参数?

  • 如何减少这个过程的计算开销?



全套代码下载:https://github.com/justmarkham/scikit-learn-videos



02



简单示例-波士顿房价预测




#同样首先,我们调用模块#matplotlib是python专门用于画图的库import matplotlib.pyplot as pltfrom sklearn import datasets#调用线性回归函数from sklearn.linear_model import LinearRegression


接着进行数据预处理,这在机器学习中是非常重要的一步。一般包含这几点:1.去除唯一属性;2.处理缺失值;3.特征编码;4.数据标准化;5.数据正则化;6.特征选择(降维)

#导入数据集#这里将全部数据用于训练,并没有对数据进行划分,上例中#将数据划分为训练和测试数据,后面会讲到交叉验证loaded_data = datasets.load_boston()data_X = loaded_data.datadata_y = loaded_data.targetname_data = dataset.feature_names

接着,我们进行特征工程。特征工程真的很重要。如果特征工程做的好,不管是模型的建立或训练,还是最终的结果呈现,都是很好的。

for i in range(13):  # 13是name_data的维数,你可以在上一步中将name_data打印出来查看  plt.subplot(7, 2, i+1) # 7行2列第i+1个图  plt.scatter(x_data[:,i], y_data, s = 10) # 横纵坐标和点的大小  plt.title(name_data[i])  plt.show()  print(name_data[i], np.corrcoef(x_data[:,i], y_data))




你会得到下面这样的不同特征与房价之间的特征图,你可以根据该图判断某一特征与房价之间的关系,并选择是否在后面建立模型的时候丢弃该特征。

经过上面散点图的分析,可以看到数据异常的变量需要特殊处理,根据散点图分析,房屋的’RM(每栋住宅的房间数)’,‘LSTAT(地区中有多少房东属于低收入人群)’,'PTRATIO(城镇中的教师学生比例)’特征与房价的相关性最大,所以,将其余不相关特征剔除。

i_ = []for i in range(len(y_data)):  if y_data[i] == 50:    i_.append(i)  # 存储房价等于50 的异常值下标x_data = np.delete(x_data, [i], axis = 0) # 删除样本异常值数据y_data = np.delete(y_data, [i], axis = 0) # 删除标签异常值me_data = dataset.feature_namesj_ = []for i in range(13):  if x_data[i] == 'RM' or 'PTRATIO' or 'LSTAT':    continue  j_.append(i) # 存储其他次要特征下标x_data = np.delete(x_data, j_, axis = 1) # 在总特征中删除次要特征print(np.shape(y_data))print(np.shape(x_data))


然后将数据分割为训练集和测试集

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(x_data, y_data, random_state = 0, test_size = 0.20)print(len(X_train))print(len(X_test))print(len(y_train))print(len(y_test))


进行数据归一化

from sklearn import preprocessingmin_max_scaler = preprocessing.MinMaxScaler()X_train = min_max_scaler.fit_transform(X_train)X_test = min_max_scaler.fit_transform(X_test)#标签归一化的目的是什么呢,实验证明,归一化之后结果好了0.1左右y_train = min_max_scaler.fit_transform(y_train.reshape(-1,1)) #转化为任意行一列y_test = min_max_scaler.fit_transform(y_test.reshape(-1,1)) #转化为一列


线性回归

#设置线性回归模块from sklearn import linear_modellr = linear_model.LinearRegression(fit_intercept=True, normalize=False)lr.fit(X_train, y_train)lr_y_predict = lr.predict(X_test)
from sklearn.metrics import r2_scorescore_lr = r2_score(y_test,lr_y_predict)


岭回归

from sklearn.linear_model import RidgeCVrr = RidgeCV(alphas=np.array([.1, .2, .3, .4]))rr.fit(X_train,y_train)rr_y_predict = rr.predict(X_test)
score_rr = r2_score(y_test,rr_y_predict)score_rr


LASSO回归

lassr = linear_model.Lasso(alpha=.0001)lassr.fit(X_train,y_train)lassr_y_predict=lassr.predict(X_test)
score_lassr = r2_score(y_test,lassr_y_predict)print(score_lassr)


SVR回归

from sklearn.svm import SVRsvr_rbf = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1) #高斯核svr_lin = SVR(kernel='linear', C=100, gamma='auto') #线性核svr_poly = SVR(kernel='poly', C=100, gamma='auto', degree=3, epsilon=.1,               coef0=1) #径向基核函数svr_rbf_y_predict=svr_rbf.fit(X_train, y_train).predict(X_test)score_svr_rbf = r2_score(y_test,svr_rbf_y_predict)  svr_lin_y_predict=svr_lin.fit(X_train, y_train).predict(X_test)score_svr_lin = r2_score(y_test,svr_lin_y_predict)   svr_poly_y_predict=svr_poly.fit(X_train, y_train).predict(X_test)score_svr_poly = r2_score(y_test,svr_poly_y_predict)   


画图

def draw_infer_result(groud_truths,infer_results):    title='Boston'    plt.title(title, fontsize=24)    x = np.arange(-0.2,2)     y = x    plt.plot(x, y)    plt.xlabel('ground truth', fontsize=14)    plt.ylabel('infer result', fontsize=14)    plt.scatter(groud_truths, infer_results,color='green',label='training cost')     plt.grid()    plt.show()


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115994
 
391 次点击