机器学习系列(6)_特征工程03碳排放小案例(上)

简介: 机器学习系列(6)_特征工程03碳排放小案例
import numpy as np
import pandas as pd
from scipy.cluster.vq import *
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from scipy.spatial.distance import cdist
from matplotlib.ticker import MultipleLocator
from matplotlib import style
from sklearn.model_selection import train_test_split 
%matplotlib inline
from scipy import stats, integrate
import seaborn as sns
import matplotlib.pyplot as plt
# seaborn中文乱码解决方案
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=20)
sns.set(font=myfont.get_name(), color_codes=True)
####
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OrdinalEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import Binarizer
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.model_selection import cross_val_score
from sklearn.tree import export_graphviz
# from sklearn.externals.six import StringIO  #pip install six  from six import StringIO
import pydotplus  #conda install pydotplus
from IPython.core.display import Image
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectFromModel
from sklearn.feature_selection import RFE
#
# import graphviz
from sklearn.datasets import load_boston  #准备导入数据集,若无法获取远程,则尽可能将数据存储在本地
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
lidf=pd.read_excel('lypdata.xlsx')
lidf.iloc[:,1:-1]

430dc66b83374740be6d8288a480acfb.png


观察上面数据:森林覆盖率产业结构是百分比,与其他列数据的差别较大


一、归一化处理



#最后列保留  lypdata
#实现归一化  三个步骤
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(lidf.iloc[:,1:-1]) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(lidf.iloc[:,1:-1]) #通过接口transform导出结果
result  #与result_结果相同,结果都是0-1之间的数据

166ac88af5684f4ea983a222d4b69063.png

#与之前的数据进行合并
lidf22=pd.concat([lidf,pd.DataFrame(result)],axis=1)
lidf22.drop(['年份','经济水平','产业结构','人口规模','城市化水平','能源消费总量','能源结构','电力消费','交通发展水平','森林覆盖率'],axis=1,inplace=True)
lidf22

归一化之后的数据,:

71e7fdb3cc7b4c32b5c7344202ebdbbd.png

lidf22.columns=(['碳排放','经济水平','产业结构','人口规模','城市化水平','能源消费总量','能源结构','电力消费','交通发展水平','森林覆盖率'])
lidf22

bf7c05eb487e428591929c7f2c703378.png

对lidf22数据的碳排放量进行分桶:分成三桶

import pandas as pd
label=[0,1,2]
k=3
lidftpf=lidf22['碳排放'].copy()  #函数中一定要使用data!!!去改函数
pingjia=pd.cut(lidftpf,k,labels=label)
pingjia
pd.DataFrame(pingjia).rename(columns={'碳排放':'评价'})
#使用concate进行合并
lidf23=pd.concat([lidf22,pd.DataFrame(pingjia).rename(columns={'碳排放':'评价'})],axis=1)
# 取出碳排放列,使用评价列来表示
lidf23.drop(['碳排放'],axis=1,inplace=True)
lidf23

9cdab44d91374b4388e9e1efa597d10b.png

# seaborn中文乱码解决方案
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=20)
sns.set(font=myfont.get_name(), color_codes=True)
lidf_corr = lidf23.corr()#计算相关性系数
plt.figure(figsize=(20,15))#figsize可以规定热力图大小
fig=sns.heatmap(lidf_corr,annot=True,fmt='.2g')#annot为热力图上显示数据;fmt='.2g'为数据保留两位有效数字
fig
# fig.get_figure().savefig('lidf_corr.png')#保留图片

得到的图片如下,黑色的数据的数值是负数

ed83dfa66b4c488c982ee2ba01ec2273.png

data=pd.read_csv("tanpaifang.csv")# 手写体数字特征提取
X=data.iloc[:,1:] # 前面的标签不要

只有16行样本数,特征只有9个

(1)过滤特征

首先使用方差过滤,将相关特征进行过滤:

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() #实例化,不填参数默认方差为0
X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
#也可以直接写成 X = VairanceThreshold().fit_transform(X)
X_var0.shape  #去掉几个?

ea3919a72676485a94a635c98ee1192c.png

#中位值只取四个特征?
import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)  #取出一半特征,如果是TOP N呢?对X.var()进行排序,比方差阈值小的全部去掉
X.var().values
np.median(X.var().values)
X_fsvar.shape

中位数只取3个特征:

4f9accef93894d74934b08b342f32927.png

(2)使用KNN和随机森林考察方差过滤对模型的影响:

#01.02 使用KNN和随机森林考察方差过滤对模型的影响
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.model_selection import cross_val_score
import numpy as np
X=lidf23.iloc[:,:-1] # X是除了评价以外的其他列
y=lidf23.iloc[:,-1] # y是评价列
X_fsvar=VarianceThreshold(np.median(X.var().values)).fit_transform(X)

abbd5b684b364fc086a9badb038e6cdf.png

(3)考察过滤前后的模型表现

考察过滤前后的模型表现
# KNN方差过滤前  
cross_val_score(KNN(),X,y,cv=5).mean()

624574b94aa34049bdb0eafc11e47452.png

# KNN方差过滤后
cross_val_score(KNN(),X_fsvar,y,cv=5).mean()

cd4761bf932a4ada8c5b69a2ca66e4b6.png

可以看到过滤之后的准确性下降了,连60%都不到。

使用随机森林提升准确度:

cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv=5).mean()  
cross_val_score(RFC(n_estimators=100,random_state=0),X,y,cv=5).mean()

这里必须使用全部的数据,因为本身数据量就小,如果数据量十分大的话才需要使用过滤法过滤掉关系较小的数据。

36b11b41dbfb4f66ae5d6cb418c4aa25.png


二、相关性过滤



lidf23.corr(method="pearson") # 相关系数矩阵,即给出了任意两个变量之间的相关系数
# pearson:相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。

bf92fee3a9e04d2b92e32f048e80f300.png

发现上面的数据少了一列评价,原因在于评价的数据类型是category类型,因此先将评价转换为int类型:

lidf23=lidf23.astype({'评价':'int'})

9d6497e1d60b4ae9907c38cf5ef0476b.png5c22a2c8e0074d8cb66cbdaf186c5824.pnga0d95662e989491f821dd548f2ddaeac.png


画出散点图,矩阵图

261468dccb8c4a5f8e7c6dad0fb10b71.png

from sklearn.ensemble import RandomForestClassifier as RFC 
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest  #k个分数最高的
from sklearn.feature_selection import chi2
#取3个特征
X_fschi = SelectKBest(chi2, k=3).fit_transform(X_fsvar, y)  
#使用方差过滤后的数据X_fsvar # 这里K=3是根据X_fvar得来的
X_fschi.shape 

9aadaf89d5154fa59a36259f21027514.png

from sklearn.ensemble import RandomForestClassifier as RFC 
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest  #k个分数最高的
from sklearn.feature_selection import chi2
#取3个特征
X_fschiall = SelectKBest(chi2, k=9).fit_transform(X, y)  # 全集的话就可以K=9,取9个特征
#使用方差过滤后的数据X_fsvar # 这里K=3是根据X_fvar得来的
X_fschiall.shape 

33a2d8f39944422e9845701ab6e9e1cb.png56b2923209694854becebaa930103c23.png

#通过学习曲线获取超参数  3个特征
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(3,0,-1):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=3).mean()
    score.append(once)
plt.plot(range(3,0,-1),score)
plt.show()

2649ed8b1ec64adaa1f84fd7d047c150.png

#通过学习曲线获取超参数  全部特征
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(9,0,-1):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(X, y)
    once = cross_val_score(RFC(n_estimators=100,random_state=0),X_fschiall,y,cv=8).mean()
    score.append(once)
plt.plot(range(9,0,-1),score)
plt.show()

36f018db14e14eab8d34b56937311bbb.png

# 通过学习曲线获取超参数  全部特征,但是用的是X_fschi
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(9,0,-1):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(X, y)
    once = cross_val_score(RFC(n_estimators=100,random_state=0),X_fschi,y,cv=9).mean()
    score.append(once)
plt.plot(range(9,0,-1),score)
plt.show()
# X_fschi:
'''
array([[0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.46153846],
       [0.46153846],
       [0.46153846],
       [0.46153846],
       [0.46153846],
       [1.        ],
       [1.        ],
       [1.        ],
       [1.        ],
       [1.        ],
       [1.        ]])'''

5c33bea2eb2245db89f107ea4c666fb3.png

可以看到K取5或者7的时候正确率可以达到100%


相关文章
|
5天前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
31 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
75 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
6月前
|
机器学习/深度学习 算法 数据挖掘
机器学习之sklearn基础——一个小案例,sklearn初体验
机器学习之sklearn基础——一个小案例,sklearn初体验
151 6
|
6月前
|
机器学习/深度学习 算法
【阿旭机器学习实战】【30】二手车价格预估--KNN回归案例
【阿旭机器学习实战】【30】二手车价格预估--KNN回归案例
|
4月前
|
机器学习/深度学习 人工智能 数据处理
【人工智能】项目实践与案例分析:利用机器学习探测外太空中的系外行星
探测外太空中的系外行星是天文学和天体物理学的重要研究领域。随着望远镜观测技术的进步和大数据的积累,科学家们已经能够观测到大量恒星的光度变化,并尝试从中识别出由行星凌日(行星经过恒星前方时遮挡部分光线)引起的微小亮度变化。然而,由于数据量巨大且信号微弱,传统方法难以高效准确地识别所有行星信号。因此,本项目旨在利用机器学习技术,特别是深度学习,从海量的天文观测数据中自动识别和分类系外行星的信号。这要求设计一套高效的数据处理流程、构建适合的机器学习模型,并实现自动化的预测和验证系统。
85 1
【人工智能】项目实践与案例分析:利用机器学习探测外太空中的系外行星
|
3月前
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。
|
5月前
|
机器学习/深度学习 人工智能
8个特征工程技巧提升机器学习预测准确性
8个特征工程技巧提升机器学习预测准确性
118 6
8个特征工程技巧提升机器学习预测准确性
|
4月前
|
机器学习/深度学习 SQL 数据采集
"解锁机器学习数据预处理新姿势!SQL,你的数据金矿挖掘神器,从清洗到转换,再到特征工程,一网打尽,让数据纯净如金,模型性能飙升!"
【8月更文挑战第31天】在机器学习项目中,数据质量至关重要,而SQL作为数据预处理的强大工具,助力数据科学家高效清洗、转换和分析数据。通过去除重复记录、处理缺失值和异常值,SQL确保数据纯净;利用数据类型转换和字符串操作,SQL重塑数据结构;通过复杂查询生成新特征,SQL提升模型性能。掌握SQL,就如同拥有了开启数据金矿的钥匙,为机器学习项目奠定坚实基础。
43 0
|
4月前
|
机器学习/深度学习 数据采集 算法
如何使用机器学习神器sklearn做特征工程?
如何使用机器学习神器sklearn做特征工程?
|
4月前
|
机器学习/深度学习 存储 分布式计算
Hadoop与机器学习的融合:案例研究
【8月更文第28天】随着大数据技术的发展,Hadoop已经成为处理大规模数据集的重要工具。同时,机器学习作为一种数据分析方法,在各个领域都有着广泛的应用。本文将介绍如何利用Hadoop处理大规模数据集,并结合机器学习算法来挖掘有价值的信息。我们将通过一个具体的案例研究——基于用户行为数据预测用户留存率——来展开讨论。
332 0