六、机器学习

分类和聚类的区别

  • 分类是有监督学习,聚类是无监督学习
  • 分类算法用于预测新样本,聚类用于理解已知数据

标准化/归一化

  1. type_se_num = type_se[type_se!= 'object'] # 类别列不参与标准化
  2. type_se_num.drop('target', inplace=True) # 目标列不参与标准化
  3. # 标准化
  4. # 方法一:使用自定义函数进行标准化
  5. def normalize(se):
  6. return (se - se.mean()) / se.std() # 这里与describe()中的std一致,不要用np.std()
  7. for col_name in type_se_num.index:
  8. data[col_name] = normalize(data[col_name])
  9. # 若是对所有列进行标准化,直接使用apply即可
  10. data = data.apply(lambda: x: (x - x.mean()) / x.std())
  11. # 方法二:使用库函数进行标准化
  12. from sklearn.preprocessing import StandardScaler
  13. data_norm = StandardScaler().fit_transform(data[type_se_num.index])
  14. df_norm = pd.DataFrame(data_norm, columns=type_se_num.index)
  15. for col_name in type_se_num.index:
  16. data[col_name] = df_norm[col_name]
  17. # 归一化
  18. data = data.apply(lambda: x: (x - x.min()) / (x.max() - x.min())

降维

  1. from sklearn.decomposition import PCA
  2. def matrixDimensionalityReduction(data,contributionRate=.95):
  3. pca = PCA()
  4. pca.fit(data)
  5. x = np.cumsum(pca.explained_variance_ratio_)
  6. # 计算贡献度大等于contributionRate的列数量
  7. for count in range(len(x)):
  8. if (x[count] >= contributionRate):
  9. count += 1
  10. break;
  11. # 降维取前count列矩阵数据处理操作
  12. pca = PCA(count)
  13. pca.fit(data)
  14. low_d = pca.transform(data) # 降维
  15. return pd.DataFrame(low_d)
  16. X = data.drop('target', axis=1)
  17. y = data['target']
  18. X = matrixDimensionalityReduction(X)

拆分测试集和训练集

  1. # 方法一: 直接取
  2. X = data[[ 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', \
  3. 'A11', 'A12', 'A13', 'A14', 'A15', 'A17', 'A18', 'A16_0', 'A16_1', 'A16_2']]
  4. y = data['price']
  5. # 方法二:删除不要的
  6. X = data.drop(['编号', '房屋朝向', 'Label'], axis=1) # 注意要删除标签列
  7. y = data['Label']
  8. from sklearn.model_selection import train_test_split
  9. train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=6)

分类模型

  1. #逻辑回归
  2. from sklearn.linear_model import LogisticRegression
  3. model=LogisticRegression()
  4. model.fit(train_X,train_y)
  5. print('逻辑回归正确率=',model.score(test_X,test_y))
  6. #随机森林
  7. from sklearn.ensemble import RandomForestClassifier
  8. model=RandomForestClassifier()
  9. model.fit(train_X,train_y)
  10. print('随机森林正确率=',model.score(test_X,test_y))
  11. #支持向量机
  12. from sklearn.svm import SVC,LinearSVC
  13. model=SVC()
  14. model.fit(train_X,train_y)
  15. print('支持向量机SVC正确率=',model.score(test_X,test_y))
  16. model=LinearSVC()
  17. model.fit(train_X,train_y)
  18. print('支持向量机LinearSVC正确率=',model.score(test_X,test_y))
  19. #梯度提升决策树
  20. from sklearn.ensemble import GradientBoostingClassifier
  21. model=GradientBoostingClassifier()
  22. model.fit(train_X,train_y)
  23. print('梯度提升决策树正确率=',model.score(test_X,test_y))
  24. #K近邻算法
  25. from sklearn.neighbors import KNeighborsClassifier
  26. model=KNeighborsClassifier()
  27. model.fit(train_X,train_y)
  28. print('K近邻算法正确率=',model.score(test_X,test_y))
  29. #朴素贝叶斯算法
  30. from sklearn.naive_bayes import GaussianNB
  31. model=GaussianNB()
  32. model.fit(train_X,train_y)
  33. print('朴素贝叶斯算法正确率=',model.score(test_X,test_y))

回归模型

  1. #线性回归
  2. from sklearn.linear_model import LinearRegression
  3. model=LinearRegression()
  4. model.fit(train_X,train_y)
  5. print('线性回归正确率=',model.score(test_X,test_y))
  6. #随机森林
  7. from sklearn.ensemble import RandomForestRegressor
  8. model=RandomForestRegressor()
  9. model.fit(train_X,train_y)
  10. print('随机森林正确率=',model.score(test_X,test_y))
  11. #决策树
  12. from sklearn.tree import DecisionTreeRegressor
  13. model=DecisionTreeRegressor()
  14. model.fit(train_X,train_y)
  15. print('决策树正确率=',model.score(test_X,test_y))

模型结果评估

  1. from sklearn.metrics import mean_squared_error, r2_score
  2. predict_y = model.predict(test_X) # model为通过不同算法选择的最优算法
  3. print('MSE Score (Test): %f' % mean_squared_error(test_y, predict_y)) #均方误差
  4. print('R2 Score (Test): %f' % r2_score(test_y, predict_y)) #R方,就是1-rmse平方根误差/var方差

网格搜索

  1. #随机森林
  2. from sklearn.ensemble import RandomForestRegressor
  3. from sklearn.metrics import mean_squared_error, r2_score
  4. model=RandomForestRegressor()
  5. model.fit(train_X,train_y)
  6. print('随机森林正确率=',model.score(test_X,test_y))
  7. # 对有效模型进行微调:网格搜索(正确率在80%左右时可以使用)
  8. from sklearn.model_selection import GridSearchCV
  9. param_grid=[{"n_estimators":[3,10,30],
  10. 'max_features':[2,4,6,8]},
  11. {'bootstrap':[False],
  12. 'n_estimators':[3,10,20],
  13. 'max_features':[2,3,4,5]}]
  14. grid_search=GridSearchCV(model, param_grid, cv=5, scoring='neg_mean_squared_error')
  15. grid_search.fit(train_X,train_y)
  16. print('最佳超参数:')
  17. print(grid_search.best_params_)
  18. print('最佳随机森林估算器:')
  19. print(grid_search.best_estimator_)
  20. print('全部估算过程:')
  21. cvres = grid_search.cv_results_
  22. for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):
  23. print(np.sqrt(-mean_score), params)
  24. # 用最佳模型继续预测和训练
  25. model = grid_search.best_estimator_
  26. predict_y = model.predict(test_X) # model为通过不同算法选择的最优算法
  27. test_mse = mean_squared_error(test_y, predict_y)
  28. test_r2 = r2_score(test_y, predict_y)
  29. print('均方误差MSE: %f' % test_mse)
  30. print('R2系数: %f' % test_r2)

聚类

  1. k = 4 #聚类的类别
  2. iteration = 500 #聚类最大循环次数
  3. from sklearn.cluster import KMeans
  4. model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类,并发数4
  5. model.fit(data_normalize) #开始聚类
  6. #简单打印结果
  7. #r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目
  8. #r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心
  9. #r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
  10. #r.columns = list(data_normalize.columns) + [u'类别数目'] #重命名表头
  11. #print(r)
  12. ##详细输出原始数据及其类别
  13. r = pd.concat([data_gr, pd.Series(model.labels_, index = data_gr.index)], axis = 1) #详细输出每个样本对应的类别
  14. r.columns = list(data_gr.columns) + [u'聚类类别'] #重命名表头
  15. #r.to_excel(outputfile) #保存结果
  16. def density_plot(df, index): #自定义作图函数
  17. import matplotlib.pyplot as plt
  18. plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  19. plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  20. p = df.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
  21. plt.title('客户群=%d, 聚类数量=%d' % (index, len(df)), x=0.5, y=3.5)
  22. [p[i].set_ylabel(u'密度') for i in range(len(df.columns))]
  23. plt.legend()
  24. return plt
  25. pic_output = '类别_' #概率密度图文件名前缀
  26. for i in range(k):
  27. density_plot(data_gr[r[u'聚类类别']==i], i).savefig(u'%s%s.png' %(pic_output, i))

机器学习分析步骤

  • 提出问题

  • 理解数据

    • 采集数据
    • 导入数据
    • 查看数据集信息
      • describe()描述统计信息
      • info()查看缺失数据
  • 数据清洗

    • 数据预处理

      • 缺失值填充fillna
      • 删除缺失值dropna
    • 特征工程
      • 特征提取(one-hot独热编码get_dummies()、map函数)(需对所有类别型字段进行独热编码处理!!!)
      • 特征选择(相关系数corr())
  • 构建模型

    • 训练数据和测试数据拆分
    • 机器学习算法选取
  • 模型评估(score)

  • 方案实施(撰写分析报告)

Python数据分析易错知识点归纳(六):机器学习的更多相关文章

  1. python函数-易错知识点

    定义函数: def greet_users(names): #names是形参 """Print a simple greeting to each user in th ...

  2. JavaScript易错知识点整理

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  3. JavaScript 易错知识点整理

    本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES ...

  4. JavaScript易错知识点整理[转]

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  5. JS易错知识点

    JAVASCRIPT易错知识点整理 前言 本文是学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由 ...

  6. Java易错知识点(1) - 关于ArrayList移除元素后剩下的元素会立即重排

    帮一个网友解答问题时,发现这样一个易错知识点,现总结如下: 1.易错点: ArrayList移除元素后,剩下的元素会立即重排,他的 size() 也会立即减小,在循环过程中容易出错.(拓展:延伸到所有 ...

  7. JavaScript易错知识点

    JavaScript易错知识点整理1.变量作用域上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. 上方的函数作用域中虽然声明并赋值了a,但位于console之下 ...

  8. Python入门---易错已错易混淆----知识点

    1.not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 结果会输出啥? 根据优先级:(not 1) or (0 and 1) or (3 a ...

  9. [置顶] 单片机C语言易错知识点经验笔记

    今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...

  10. Python的易错点

    一.列表和元组的区别 列表是允许修改的,而元组是不能修改的,元组只能实现拼接,形成一个新的元组.两者可以实现相互转换,列表转换成元组使用truple函数,而元组转换成列表使用list函数. 二.Raw ...

随机推荐

  1. mysql 命令批量修改一个字段/帝国cms sql命令修改一个字段

    UPDATE phome_enewstagsdata SET classid=5 where classid=1 UPDATE phome_ecms_news SET classid=8 where ...

  2. vue刷新当前组件的方法

    一:v-if控制组件,先设false,再true强制刷新组件(有时会产生一种奇怪的效果) 1 <medical-record v-if="fresh" /> 2 3 t ...

  3. MySQL之主从复制搭建

    文章目录 主从复制 主从搭建 配置主从复制的命令 测试 总结 主从复制 主从也叫做(AB复制),允许一个服务器从一个服务器数据库(主服务器)的数据复制到一个或者多个MySQL数据库服务器. 主从复制的 ...

  4. 使用ChatGPT4协助完成读取文件中不同字的数量

    使用ChatGPT4识别:用java读取文件中不同字的个数. 解析:该程序将读取名为"file.txt"的文件,并计算文件中每个不同字的出现次数.它使用一些字符串操作来清理单词,并 ...

  5. map和multimap

    map相对于set区别,map具有键值和实值,所有元素根据键值自动排序,pair的第一个值被称为键值key,pair的第二个值被称为实值value.map也是以红黑树为底层实现机制,根据key进行排序 ...

  6. 2023-04-25:给定两个长度为N的数组,a[]和b[] 也就是对于每个位置i来说,有a[i]和b[i]两个属性 i a[i] b[i] j a[j] b[j] 现在想为了i,选一个最

    2023-04-25:给定两个长度为N的数组,a[]和b[] 也就是对于每个位置i来说,有a[i]和b[i]两个属性 i a[i] b[i] j a[j] b[j] 现在想为了i,选一个最好的j位置, ...

  7. 2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写。

    2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写. 答案2023-03-24: 这是一个使用FFmpeg库将MP3和H.264混合编码为MP4的Go语言程序. ...

  8. 2020-11-12:java中as-if-serial语义和happen-before语义有什么区别?

    福哥答案2020-11-12: as-if-serial语义单线程执行结果不被改变.happen-before语义正确同步的多线程执行结果不被改变.***这道题网上已经说烂了,就不必重复了.[happ ...

  9. 2021-04-16:摆放着n堆石子。现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。求出将n堆石子合并成一堆的最小得分(或最大得分)合

    2021-04-16:摆放着n堆石子.现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.求出将n堆石子合并成一堆的最小得分(或最大得分)合 ...

  10. 深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件

    深入理解 python 虚拟机:破解核心魔法--反序列化 pyc 文件 在前面的文章当中我们详细的对于 pyc 文件的结构进行了分析,pyc 文件主要有下面的四个部分组成:魔术. Bite Filed ...