热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kaggle工业蒸汽

数据信息工业蒸馏数据import库函数importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimport
数据信息

工业蒸馏数据

import库函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline

数据读取

# 数据集路径
test_data_file = "./zhengqi_test.txt"
train_data_file = "./zhengqi_train.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')# 得到没有NAN值,并且数据有三十八个特征,一个标签
# 因为数据标签没有显示,所以无法主观判断数据之间的关系
train_data.info()#38个特征一个标签
train_data.describe()

箱线图

def box_map(Data):"""画出Data的所有的特征标签对应的箱线图"""#指定画布大小:plt.figure(figsize=(18, 10))#确定数据和画的标签列表plt.boxplot(Data.values, labels=Data.columns)#设置一些直线参数plt.hlines([-7.5, 7.5], 0, 40, "red")
"""
箱线图另一种画法:
#取出每个特征的标签,以便画图
column = Data.columns.tolist()[:39]
# 指定绘图对象宽度和高度
fig = plt.figure(figsize=(20, 40))
for i in range(38):# 一张画布画13行3列plt.subplot(13, 3, i + 1)sns.boxplot(Data[column[i]]# 数据, orient="v"# “v”|“h” 用于控制图像使水平还是竖直显示, width=0.5) # 箱式图# 添加标签名称plt.ylabel(column[i], fontsize=8)
"""

# 画出箱线图
box_map(train_data)
# 我们发现还是有很多在误差上下界外的数据(异常点),所以说我们要将这些数据删除掉

请添加图片描述

箱线图解释连接

在这里插入图片描述

获取并删除异常值

from sklearn.metrics import mean_squared_error# model使用那个模型寻找异常值。train_data,sigma为阈值
# 就是用残差的分布转化成标准正态分布,残差在正态分布sigma外的数据为异常数据
def find_outliers(model, train_data, sigma=3):ALLX = train_data.iloc[:, 0:-1]ALLY = train_data.iloc[:, -1]"""使用model来见到的预测每一个标签值,若差距过大,就删除该条数据"""plt.figure(figsize=(15, 3 * 38))# 38个标签特征# 对于每一个特征值都进行删除异常值操作for i, eachName in enumerate(ALLX.columns):print("this is "+str(eachName)+" situation:")_y = ALLX.loc[:, eachName]# 被预测的特征数据_X = ALLX.drop(eachName, axis=1)# 用于模型训练的数据model.fit(_X, _y)y_pred = pd.Series(model.predict(_X), index=_y.index)from sklearn.metrics import r2_score#捕捉的信息量比例(不能反了)R2=r2_score(model.predict(_X),_y)print("均方误差MSE:{}, R^2:{}".format(round(mean_squared_error(_y, y_pred), 4), round(R2, 4)))# 残差值resid = _y - y_pred# 残差值均值resid_mean = resid.mean()# 计算标准差啊resid_std = resid.std()print("残差均值resid_mean:{}, 残差标准差resid_std:{}".format(round(resid_mean, 4), round(resid_std, 4)))# 残差标准化成正态分布,就是公式: F(x)=Φ[(x-μ)/σ]z = (resid - resid_mean) / resid_std# 异常值位置(真实值和预测值偏离程度较大,大于sigma倍标准差)outliers = z[abs(z) > sigma].index # 取横向坐标索引便于删除异常值数据print("异常值索引outlier index:", outliers.tolist())# *******************可视化异常值(呈现正相关性越好)*****************# ---------------真实和预测数据之间的关系----------------# 创建ax_1子图ax_1 = plt.subplot(38, 3, i * 3 + 1)# 画出真实值和预测值,用“.”代表样本,颜色默认plt.plot(_y, y_pred, ".", label="Accepted")# 将异常值数据进行单独标出,用红色标出,有外轮廓plt.plot(_y.loc[outliers], y_pred[outliers], "ro", label="Outlier")# y轴为预测值plt.ylabel("y_pred")# x轴为真实值plt.xlabel("true_y of " + eachName)plt.legend()# ---------------残差 越靠近零值越好----------------ax_2 = plt.subplot(38, 3, i * 3 + 2)# 画出残差点plt.plot(_y, _y - y_pred, ".", label="Accepted")# 画出异常值数据的残差点plt.plot(_y.loc[outliers], _y.loc[outliers] - y_pred.loc[outliers], "ro", label="Outlier")plt.ylabel("residual")plt.xlabel("true_y of " + eachName)plt.legend()# ---------------绘制直方图,样本分布----------------ax_3 = plt.subplot(38, 3, i * 3 + 3)# 样本分箱50,颜色蓝色ax_3.hist(z, bins=50, facecolor="blue")# 异常值搞成红色ax_3.hist(z.loc[outliers], bins=50, facecolor="red")plt.legend(["Accepted", "Outlier"])plt.xlabel("distribution of " + eachName)if R2 > 0.7:# 根据异常值将样本数据异常值点删除ALLX = ALLX.drop(outliers)ALLY = ALLY.drop(outliers)# 自动进行子图缩进plt.tight_layout()# 返回删除异常值的train_datadata=pd.concat([ALLX,ALLY],axis=1)data.index=list(range(data.shape[0]))return datafrom sklearn.linear_model import Ridge
train_data=find_outliers(Ridge(),train_data, sigma=3)

那么得到的数据在正态分布上就是一下两个图的组合,sigma就是图中的z
在这里插入图片描述
在这里插入图片描述
样本删除可视化后:
请添加图片描述
删除后的箱线图:虽然还有很多
在这里插入图片描述

是否符合正态分布

def prob_kde(train_data):"""画出样本分布&#xff0c;和Q-Q图"""train_cols &#61; 6 # 一行三个特征train_rows &#61; len(train_data.columns)# 特征个数# 4个单位一个图&#xff0c;纵&#xff1a;4 * train_cols 横&#xff1a;需要train_rows / 3行plt.figure(figsize&#61;(4 * train_cols, 4 * train_rows / 3))i &#61; 0for col in train_data.columns[:-1]:dat &#61; train_data[[col, "target"]].dropna()i &#43;&#61; 1ax &#61; plt.subplot(train_rows / 3, train_cols, i)# seaborn中的函数distplot画出分布密度函数以及核密度函数&#xff0c;默认参数直方图hist&#61;True 核函数kde&#61;Truesns.distplot(dat[col], fit&#61;stats.norm)# 拟合stats.norm正态分布plt.title("skew&#61;" &#43; "{:.4f}".format(stats.skew(dat[col])))#计算偏态问题质数""" skewness &#61; 0 : normally distributed.skewness > 0 : more weight in the left tail of the distribution.skewness <0 : more weight in the right tail of the distribution. """i &#43;&#61; 1ax &#61; plt.subplot(train_rows / 3, train_cols, i)# scipy.stats中的函数 能Q-Q图,越靠近直线越服从正态分布res &#61; stats.probplot(dat[col], plot&#61;plt)# 计算相关系数plt.title("corr&#61;" &#43; "{:.2f}".format(np.corrcoef(dat[col], dat["target"])[0][1]))plt.tight_layout()

训练数据和测试数据的分布关系

def train_test_kde(train_data, test_data, columns):# 一行六张图&#xff0c;六个特征dist_cols &#61; 6dist_rows &#61; len(test_data.columns)# 创建7行空间&#xff0c;一个字图为正方形&#xff0c;4个单位像素plt.figure(figsize&#61;(4 * dist_cols, 4 * 7))i &#61; 1for col in columns:ax &#61; plt.subplot(7, dist_cols, i)# 训练数据核密度函数sns.kdeplot(train_data[col], color&#61;"red", shade&#61;True,label&#61;"train")# 测试数据核密度函数sns.kdeplot(test_data[col], color&#61;"blue", shade&#61;True,label&#61;"test")# 添加特征名称plt.xlabel(col)# 纵坐标plt.ylabel("Frequence")plt.legend()i &#43;&#61; 1plt.tight_layout()#看train_data和test_data中标签对应的数据是否分布相似&#xff0c;
# 若不相似会导致模型非泛化能力变差&#xff0c;需要删除此类特征。
train_test_kde(train_data,test_data,X_train.columns)

请添加图片描述

#特征变量V5,V9,V11,V17,V22,V28在训练集和测试集中的数据分布不一致,所以要删除特征数据
drop_columns&#61;["V5","V9","V11","V17","V22","V28"]
# 指定删除columns特征&#xff0c;覆盖原数据
train_data.drop(columns &#61; drop_columns, inplace&#61;True)
test_data.drop(columns &#61; drop_columns, inplace&#61;True)

训练和测试数据归一化正态化

数据分布情况&#xff1a;

def prob_kde(train_data):"""画出样本分布&#xff0c;和Q-Q图"""train_cols &#61; 6 # 一行三个特征train_rows &#61; len(train_data.columns)# 特征个数# 4个单位一个图&#xff0c;纵&#xff1a;4 * train_cols 横&#xff1a;需要train_rows / 3行plt.figure(figsize&#61;(4 * train_cols, 4 * train_rows / 3))i &#61; 0for col in train_data.columns[:-1]:dat &#61; train_data[[col, "target"]].dropna()i &#43;&#61; 1ax &#61; plt.subplot(train_rows / 3, train_cols, i)# seaborn中的函数distplot画出分布密度函数以及核密度函数&#xff0c;默认参数直方图hist&#61;True 核函数kde&#61;Truesns.distplot(dat[col], fit&#61;stats.norm)# 拟合stats.norm正态分布plt.title("skew&#61;" &#43; "{:.4f}".format(stats.skew(dat[col])))#计算偏态问题质数""" skewness &#61; 0 : normally distributed.skewness > 0 : more weight in the left tail of the distribution.skewness <0 : more weight in the right tail of the distribution. """i &#43;&#61; 1ax &#61; plt.subplot(train_rows / 3, train_cols, i)# scipy.stats中的函数 能Q-Q图,越靠近直线越服从正态分布res &#61; stats.probplot(dat[col], plot&#61;plt)# 计算相关系数plt.title("corr&#61;" &#43; "{:.2f}".format(np.corrcoef(dat[col], dat["target"])[0][1]))plt.tight_layout()# 然后看每个特征数据是否符合标准正态分布
prob_kde(train_data)
# 从图中可以看出&#xff1a;
# 基本所有数据存在偏态问题&#xff0c;其中特征V9 V18 V23 V24 存在较为严重的偏态问题

请添加图片描述

# 未解决数据偏态问题&#xff0c;我们对于每个特征数据进行标准化&#xff0c;可视化&#xff1a;
# 预先进行归一化操作(全部数据&#xff0c;建议在数据量比较大的时候进行处理)
from sklearn.preprocessing import MinMaxScaler
def func_mms(train,test):# 取出需要归一化的特征cols_numeric &#61; test.columns# 创建归一化方法# 对train,test进行数据训练train_data_process &#61; pd.DataFrame(MinMaxScaler().fit_transform(train[cols_numeric]), columns&#61;cols_numeric)test_data_process &#61; pd.DataFrame(MinMaxScaler().fit_transform(test[cols_numeric]), columns&#61;cols_numeric)return pd.concat([train_data_process, train_data["target"]], axis&#61;1),test_data_process#调用归一化函数
train_data,test_data&#61;func_mms(train_data,test_data)

stats.boxcox正态化&#xff1a;

for var in test_data.columns:train_data[var], lambda_var &#61; stats.boxcox(train_data[var].dropna() &#43; 1) # 数值只能是正值test_data[var], lambda_var &#61; stats.boxcox(test_data[var].dropna() &#43; 1) # 数值只能是正值

prob_kde(train_data)

请添加图片描述

多重共线性

通过热力图查看

train_corr &#61; train_data.corr()# 生成关系矩阵
plt.figure(figsize&#61;(20, 16))
sns.heatmap(train_corr, vmax&#61;0.8, square&#61;True, annot&#61;True)#热力图

颜色越浅共线性越强&#xff1a;
请添加图片描述

#我们取出和便签["target"]相关系数最高的十个特征
#columns参数就是和标签target相关系数最高的十个特征&#xff0c;组成&#xff08;10&#xff0c;train_corr.shape[0]&#xff09;矩阵
#然后取出最大值特征相对于taregt的数据组成pandas.Series数据nlargest_f
nlargest_f &#61; train_corr.nlargest(10, columns&#61;"target")["target"]
cols &#61; nlargest_f.index
plt.figure(figsize&#61;(10, 10))
sns.heatmap(train_data[cols].corr(), annot&#61;True, square&#61;True)
#除了主对角线之外&#xff0c;其他的部分颜色越浅&#xff0c;代表相关性系数越高&#xff0c;多重共线性更加明显。

在这里插入图片描述

通过多重共线性方差膨胀因子查看

from statsmodels.stats.outliers_influence import variance_inflation_factor #多重共线性方差膨胀因子
cols&#61;train_data.columns
X&#61;np.matrix(train_data[cols])
VIF_list&#61;[variance_inflation_factor(X, i) for i in range(X.shape[1])]
#VIF_list就是膨胀因子

方差膨胀因子的解释
请添加图片描述
PCA解决多重线性问题&#xff1a;
不过这里效果不好&#xff0c;没使用

# from sklearn.decomposition import PCA #主成分分析
# #PCA方法降维处理多重共线性
# #保持90%的信息
# pca &#61; PCA(n_components&#61;0.95)
# new_train_data &#61; pca.fit_transform(train_data.iloc[:,0:-1])
# new_test_data &#61; pca.transform(test_data)
# new_train_data &#61; pd.DataFrame(new_train_data)
# new_test_data &#61; pd.DataFrame(new_test_data)
# new_train_data[&#39;target&#39;] &#61; train_data[&#39;target&#39;]
# new_train_data.describe()


推荐阅读
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
author-avatar
同亮uncle_847
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有