资讯详情

【啃书系列】机器学习(1)

【啃书系列】-机器学习

第一部分 工业蒸汽量预测

1.题型总结机器学习

(1)回归预测模型

输入:实值或离散数 输出:连续值域上的任意值

分类:
  • 多元回归问题:多输入变量回归问题
  • 时间序列预测:按时间排序输入变量的回归

(2)分类预测模型

输入:实值或离散数 输出:将实例分为两个或多个类别中的一个

分类:
  • 二级分类问题/二元分类问题
  • 多类分类问题

2、过程

  1. 划分数据集
  2. 缺失值补充
  3. 异常值处理
  4. 处理特征(特征工程)
  5. 特征降维
  6. 模型训练
  7. 模型验证
  8. 特征优化
  9. 模型融合

3、解题思路

需要根据V0~V共有38个特征变量来预测蒸汽量的值,其预测值为连续兴数值变量,因此回归预测求解。可选择模型:
  • 线性回归【Linear Regression】
  • 岭回归【Ridge Regression】
  • LASSO回归
  • 决策树回归【Decision Tree Regressor】
  • 梯度提升树回归【Gradient Boosting Decision Tree Regressor】

4、数据分析

(1)数据集【百度网盘满了,懒得删,不想买会员,想私聊我】

在这里插入图片描述

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats import warnings warnings.filterwarnings("ignore")  train_data_file = "./zhengqi_train.txt" test_data_file = "./zhengqi_test.txt"  train_data = pd.read_csv(train_data_file,sep='\t',encoding='utf-8') test_data = pd.read_csv(test_data_file,sep='\t',encoding='utf-8') 

(2)变量识别

#1、看值 train_data.head() test_data.head()  #2、看形状 train_data.shape test_data.shape  #3.查看训练集和测试集的比例 train_data.shape[0]/(train_data.shape[0] test_data.shape[0]) test_data.shape[0]/(train_data.shape[0]+test_data.shape[0])

#4、查看数据基本信息:看有无缺失值(说明没有缺失值)和数据类型
train_data.info()
test_data.info()

(3)划分数据集

#划分数据集:X和label,train和test[大赛给的test是没有标签的,我们需要在train数据集里面划分我们自己的train和test]
from sklearn.model_selection import train_test_split
X = train_data.drop('target',axis=1)
y = train_data.target
X.shape,y.shape
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,shuffle=True)#80%做训练集,20%做测试集
X_train.shape,X_test.shape,y_train.shape,y_test.shape

(4)变量分析

  1. 单变量分析
  • 连续型变量:统计数据的中心分布趋势和变量的分布
  • 类别型变量:使用频次或占比表示每个类别的分布情况,对应的衡量指标分别是类别变量的频次(次数)和频率(占比),可以用柱形图来表示可视化分布情况。
  1. 双变量分析
  • 连续型 VS 连续型 (1) 【直观】绘制散点图 (2) 【量化】计算相关性 C o r r e l a t i o n = C o n v a r i a n c e ( X , Y ) V a r ( X ) ∗ V a r ( Y ) Correlation = \frac{Convariance(X,Y)}{\sqrt{Var(X)*Var(Y)}} Correlation=Var(X)∗Var(Y) ​Convariance(X,Y)​

代码如下

import nurnpy as np 
X = np.array((65 , 72, 78 , 65 , 72 , 70 , 65 , 68]) 
Y=np . array([72 , 69 , 79 , 69 , 84 , 75 , 60 , 73]) 
np.corrcoef(X, Y)

结果:

  • 类别型 VS 类别型 (1) 双向表 (2) 堆叠柱状图 (3) 卡方检验:主要用于两个和两个以上样本率(构成比)及两个二值型离散变量的关联性分析,即比较伦理频次与实际频次的吻合程度或拟合程度
from sklearn.da asets import load_ iris 
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2 
iris= load_iris() 
X, y = iris.data, iris.target 
chiValues = chi2(X, y) 
X new = Select.KBest(chi2, k=2).fit_transform(X, y)
  • 类别型 VS 连续型 (1) 绘制小提琴图(Violin Plot) 【建议使用Seaborn包中的violinplot()函数】
pd.set_option ('display.max_columns', 10) 
pd.set_option ('display.max_rows', 10) 
data_trainl =train_data.drop(['V5','V9','V11','V17','V22','V28'],axis=1) 
train_corr = data_trainl.corr()
train_corr

画出热力图

ax = plt.subplots(figsize= (20, 16)) #调整画布大小
ax= sns.heatmap(train_corr,vmax=.8 , square=True, annot=True)#画热力图

(5)缺失值处理【没有缺失值,没进行】

  1. 删除
  2. 平均值、众数、中值填充
    • 一般填充是用该变量下所有非缺失值的平均值或中值来补全缺失值。
    • 相似样本填充是利用具有相似特征的样本的值或者近似值进行填充。
  1. 预测模型填充 在这种情况下,会把数据集分为两份 一份是没有缺失值的 ,用作训练集; 另一份是有缺失值的 ,用作测试集 。 这样缺失的变量就是预测目标,此时可以使用回归、分类等方法来完成填充。

(6)异常值处理

操作1. 异常值检测
    • 箱线图 不在-1.5 * IQR和 1.5 * IQR 之间的样本点认为是异常值
#所有变量的箱型图
column = train_data.columns.tolist()[:39]  #列表头
fig = plt.figure(figsize=(80,60),dpi=75)  #指定绘图对象的宽度和高度
for i in range(38):
    plt.subplot(7,8,i+1) #8列子图
    sns.boxplot(data=train_data[column[i]],width=0.5)  
    plt.ylabel(column[i],fontsize=36)#显示的纵坐标的大小
plt.show()

#另一种画法
plt.figure(figsize=(18,10))
plt.boxplot(x=train_data.values,labels=train_data.columns)
plt.hlines([-7.5,7.5],0,40,colors='r')#0,40是这条线的长度
plt.show()

    • 直方图
    • 散点图
操作2.寻找具体异常值
#异常值的处理
def find_outliers(model,X,y,sigma=3):
    try:#用模型来预测y值
        y_pred = pd.Series(model.predict(X),index=y.index)
    except:#如果预测失败,尝试先调整模型
        model.fit(X,y)
        y_pred = pd.Series(model.predict(X),index=y.index)
    
    resid = y-y_pred #模型的预测值和真实值相减
    mean_resid = resid.mean()#均值
    std_resid = resid.std()#方差
    
    z = (resid-mean_resid)/std_resid
    outliers = z[abs(z)>sigma].index#异常值
    
    print('R2=',model.score(X,y))#用来度量样本回归线的拟合优度=回归平方和/总平方和
    print('mse=',mean_squared_error(y,y_pred))
    print('-----------------------------------------')
    
    print('mean of residuals:',mean_resid)
    print('std of residuals:',std_resid)
    print('-----------------------------------------')
    
    print((len(outliers),'outliers:'))
    print(outliers.tolist())
    
    plt.figure(figsize=(15,5))
    ax_131 = plt.subplot(1,3,1)
    plt.plot(y,y_pred,'.')#中间的蓝点
    plt.plot(y.loc[outliers],y_pred.loc[outliers],'ro')#outlier 的红点
    plt.legend(['Accepted','Outlier'])#顺序要和上面的对应
    plt.xlabel('y')
    plt.ylabel('y_pred')
    
    ax_132 = plt.subplot(1,3,2)
    plt.plot(y,y-y_pred,'.')
    plt.plot(y.loc[outliers],y.loc[outliers]-y_pred.loc[outliers],'ro')
    plt.legend(['Accepted','Outlier'])
    plt.xlabel('y')
    plt.ylabel('y-y_pred')
    
    ax_133 = plt.subplot(1,3,3)
    z.plot.hist(bins=50,ax=ax_133)#hist直方图
    z.loc[outliers].plot.hist(color='r',bins=50,ax=ax_133)
    plt.legend(['Accepted','Outlier'])
    plt.xlabel('z')
    
    plt.savefig('outliers.png')
    
    return outliers

#用数据预测y y值与均值之差 超过多少个方差的 视为异常值
outliers = find_outliers(Ridge(),X_train,y_train,sigma=3)
操作2. 异常值处理
    • 删除
    • 转换:数据转换可以消除异常值 如对数据取对数会减轻由极值引起的变化
    • 填充:像处理缺失值一样,我们可以对异常值进行修改,如使用平均值、中值或其他的一些填补方法。在填补之前 需要分析异常值是自然形成的,还是人为造成的。如果是人为造成的,则可以进行填充处理,如使用预测模型填充
    • 区别对待 :如果存在大量的异常值,则应该在统计模型中区别对待。其中一个方法是将数据分为两个不同的组:异常值归为一组,非异常值归为一组,且两组分别建立模型,然后最终将两组的输出合并。
#1、删除异常值(横着删)
X_train = X_train.drop(outliers)
y_train = y_train.drop(outliers)
X_train.shape,y_train.shape

#2、删除异常值(竖着删)
#针对每一个特征向量删掉样本异常点
for f in X_train.columns:
    X_ = X_train.drop(f,axis=1)#把特征值“V0”删掉
    y_ = X_train[f]#特征值“V0”
    outliers = find_outliers(Ridge(),X_,y_,sigma=4)
    X_train = X_train.drop(outliers)
    y_train = y_train.drop(outliers)
    X_train.shape,y_train.shape

5、特征工程

1、数据预处理
  • 数据采集
  • 数据清洗
  • 数据采样: 数据在采集、清洗过以后 正负样本是不均衡的,故要进行数据采样。采样的方法有随机采样和分层抽样。但由千随机采样存在隐患,可能某次随机采样得到的数据很不均匀,因此更多的是根据特征进行分层抽样》
    • 正样本>负样本,且量都特别大的情况;采用下采样(downsampling)的方法。
    • 正样本>负样本,且量不大的情况,可采用以下方法采集更多的数据:上采样(oversampling),比如图像识别中的镜像和旋转;修改损失函数(loss function)设置样本权重。
2、特征处理
  1. 标准化 依照特征矩阵的列处理数据 ,即通过求标准分数的方法,将特征转换为标准正态分布,并和整体样本分布相关。每个样本点都能对标准化产生影响。 标准化需要计算特征的均值和标准差,公式如下 x ′ = x − X ‾ S x^{'}=\frac{x-\overline{X}}{S} x′=Sx−X​
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data)
  1. 区间缩放法 区间缩放法的思路有多种,常见的一种是利用两个最值(最大值和最小值)进行缩放。 x ′ = x − M i n M a x − M i n x^{'}=\frac{x-Min}{Max-Min} x′=Max−Minx−Min​
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)
  1. 归一化 归一化是将样本的特征值转换到同 量纲下,把数据映射到[0,1] 或者[a,b] 区间内,由于其仅由变量的极值决定,因此区间缩放法是归一化的一种。 归一区间会改变数据的原始距离、分布和信息,但标准化般不会。 规则为L2的归一化公式如下: x ′ = x ∑ j m x [ j ] 2 x^{'}=\frac{x}{\sqrt{\sum_j^m{x[j]}^2}} x′=∑jm​x[j]2 ​x​
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(iris.data)

  • 如果对输出结果范围有要求,则用归一化。
  • 如果数据较为稳定,不存在极端的最大值或最小值,则用归一化。
  • 如果数据存在异常值和较多噪声,则用标准化,这样可以通过中心化间接避免异常值和极端值的影响。
  • 支持向量机 (Support Vector Machine, SVM)、K近邻 (K-Nearest Neighbor, KNN)、主成分分析 (Principal Component Analysis, PCA) 等模型都必须进行归一化或标准化操作。
  1. 定量特征二值化 定量特征二值化的核心在于设定一个阙值,大于阙值的赋值为1,小于等于阙值的赋值为0.
from sklearn.preprocessing import Binarizer
Binarizer(threshold=3).fit_transform(iris.data)
  1. 定性特征哑编码 哑变量,也被称为虚拟变量,通常是人为虚设的变量,取值为0或1,用来反映某个变量的不同属性。将类别变量转换为哑变量的过程就是哑编码。而对于有n个类别属性的变量,通常会以1个类别特征为参照,产生n-1个哑变量。 引入哑变量的目的是把原本不能定量处理的变量进行量化,从而评估定性因素对因变量的影响。
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder(categories='auto').fit_transform(iris.target.reshape((-1,1)))
  1. 缺失值处理 当数据中存在缺失值时,用 Pandas 读取后特征均为 NaN, 表示数据缺失,即数据未知.
from numpy import vstack,array,nan
from sklearn.impute import SimpleImputer

#缺失值处理,返回值为处理缺失值后的数据
#参数 missing_value 为缺失俏的表示形式,默认为 NaN
#参数 strategy 为缺失值的填充方式,默认为 mean (均值)
SimpleImputer().fit_transform(vstack((array([nan,nan,nan,nan]),iris.data)))
  1. 数据转换
    • 多项式转换 4个特征,度为2的多项式转换公式为
from sklearn.preprocessing import PolynomialFeatures
PolynomialFeatures().fit_transfor(iris.data)
    • 对数变换 基于单变元函数的数据转换可以使用一个统一的方法完成。
from numpy import loglp
from sklearn.preprocessing import FunctionTransformer
FunctionTransformer(loglp,validate
        标签: 连接器fit系列

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台