当前位置: 首页 > news >正文

元典科技网站建设泸州网站制作

元典科技网站建设,泸州网站制作,禹城网站建设,苏州seo排名公司文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池#xff1a;https://tianchi.aliyun.com/competition/entrance/231784/informat… 文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池https://tianchi.aliyun.com/competition/entrance/231784/information 主要参考了Datawhale的整个操作流程https://tianchi.aliyun.com/notebook/95501 小编也是第一次接触数据挖掘所以先跟着Datawhale写的教程操作了一遍不懂的地方加了一点点自己的理解感谢Datawhale 目标 将数据转换为能更好地表示潜在问题的特征从而提高机器学习的性能 常见的特征工程 异常处理 通过箱线图或 3-Sigma分析删除异常值 ①比如在使用箱线图分析删除异常值时我们可以将大于或小于1/4分位数的值都删掉 ②3-Sigma分析假设数据服从正态分布根据3-Sigma法则异常值通常被定义为距离均值超过3个标准差的数据点。因此可以计算上下阈值即均值加减3倍标准差BOX-COX 转换处理有偏分布 Box-Cox转换是一种统计方法用于使数据集更接近于正态分布。它通过对数据进行幂变换来实现这一目的可以处理偏态分布或方差不稳定的数据长尾截断 特征归一化/标准化 标准化转换为标准正态分布归一化抓换到 [0,1] 区间针对幂律分布可以采用公式 数据分桶 等频分桶 等频分桶的基本思想是根据数据的频率分布将数据均匀地划分为指定数量的桶。每个桶中包含的数据数量大致相等因此每个桶中的数据密度相对均匀。这有助于减少数据的离散性使得数据分析更加稳定和可靠等距分桶 等距分桶的基本思想是将数据范围划分成相等宽度的区间每个区间称为一个桶Best-KS 分桶类似利用基尼指数进行二分类 KS统计量Kolmogorov-Smirnov statistic通常用于评估两个概率分布的差异性。Best-KS分桶的目标是在保持数据分布的情况下将连续型数据分成若干个桶bin使得每个桶内的数据尽可能服从同一种分布并且不同桶之间的分布差异尽可能大卡方分桶 用于对连续型特征进行分桶binning或分箱binning。它通过最大化特征与目标变量之间的卡方统计量来确定最优的分桶方案。 缺失值处理 不处理针对类似 XGBoost 等树模型删除缺失数据太多插值补全包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等分箱缺失值一个箱 特征构造 构造统计量特征报告计数、求和、比例、标准差等时间特征包括相对时间和绝对时间节假日双休日等地理信息包括分箱分布编码等方法非线性变换包括 log/ 平方/ 根号等特征组合特征交叉仁者见仁智者见智。 特征筛选 过滤式filter先对数据进行特征选择然后在训练学习器常见的方法有 Relief/方差选择发/相关系数法/卡方检验法/互信息法包裹式wrapper直接把最终将要使用的学习器的性能作为特征子集的评价准则常见方法有 LVMLas Vegas Wrapper 嵌入式embedding结合过滤式和包裹式学习器训练过程中自动进行了特征选择常见的有 lasso 回归 降维 PCA/ LDA/ ICA特征选择也是一种降维。 具体步骤 1. 导入数据 # 导入数据 train_datapd.read_csv(train_path,sep ) test_datapd.read_csv(test_path,sep ) # 查看数据 train_data.head() # 查看数据形状 train_data.shape # 查看数据的列 train_data.columns2. 删除异常值 # 这里包装了一个异常值处理的代码可以随便调用。 def outliers_proc(data, col_name, scale3):用于清洗异常值默认用 box_plotscale3进行清洗:param data: 接收 pandas 数据格式:param col_name: pandas 列名:param scale: 尺度:return:def box_plot_outliers(data_ser, box_scale):利用箱线图去除异常值:param data_ser: 接收 pandas.Series 数据格式:param box_scale: 箱线图尺度:return:# 计算四分位距并通过box_scale进行缩放iqr box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))# 计算下边缘值即下四分位数减去四分位距val_low data_ser.quantile(0.25) - iqr# 计算上边缘值即上四分位数加上四分位距val_up data_ser.quantile(0.75) iqr# 创建一个布尔序列指示哪些数据点低于下边缘值rule_low (data_ser val_low)# 创建一个布尔序列指示哪些数据点高于上边缘值rule_up (data_ser val_up)return (rule_low, rule_up), (val_low, val_up)data_n data.copy()data_series data_n[col_name]rule, value box_plot_outliers(data_series, box_scalescale)# 使用布尔数组来选择索引返回满足条件的索引值数组,即找到异常值所在对的索引位置index np.arange(data_series.shape[0])[rule[0] | rule[1]]print(Delete number is: {}.format(len(index)))data_n data_n.drop(index)# reset_index重新设置 DataFrame 的索引# 参数 dropTrue 表示重置索引后丢弃原来的索引列# inplace 参数用于指定是否在原始 DataFrame 上进行修改data_n.reset_index(dropTrue, inplaceTrue)print(Now column number is: {}.format(data_n.shape[0]))# 查看低于下界的数据index_low np.arange(data_series.shape[0])[rule[0]]outliers data_series.iloc[index_low]print(Description of data less than the lower bound is:)print(pd.Series(outliers).describe())# 查看高于上界的数据index_up np.arange(data_series.shape[0])[rule[1]]outliers data_series.iloc[index_up]print(Description of data larger than the upper bound is:)print(pd.Series(outliers).describe())# 创建一个包含两个子图的画布。参数 1, 2 表示创建一个1行2列的子图网格figsize(10, 7) 表示画布的大小为宽10英寸高7英寸# fig 是整个画布对象ax 是一个包含两个子图对象的数组fig, ax plt.subplots(1, 2, figsize(10, 7))# 画出去除异常值前后的子图sns.boxplot(ydata[col_name], datadata, paletteSet1, axax[0])sns.boxplot(ydata_n[col_name], datadata_n, paletteSet1, axax[1])return data_n结果展示 3. 特征构造 3.1 为树模型构造特征 训练集和测试集放在一起方便构造特征 train_data[train]1 test_data[train]0 data pd.concat([train_data, test_data], ignore_indexTrue)加入使用时间data[‘creatDate’] - data[‘regDate’]反应汽车使用时间一般来说价格与使用时间成反比 # 注意数据里有时间出错的格式所以我们需要 errorscoerce表示如果出现无法转换的情况将会将其转换为 NaTNot a Time值而不是抛出错误 data[used_time] (pd.to_datetime(data[creatDate], format%Y%m%d, errorscoerce) - pd.to_datetime(data[regDate], format%Y%m%d, errorscoerce)).dt.days查看空数据 # 看一下空数据发现有 15k 个样本的时间是有问题的可以选择删除也可以选择放着。 # 但是这里不建议删除因为删除缺失数据占总样本量过大7.5% # 如果使用 XGBoost 之类的决策树其本身就能处理缺失值所以可以不用管 data[used_time].isnull().sum()加入从邮编中提取城市信息相当于加入了先验知识 data[city] data[regionCode].apply(lambda x : str(x)[:-3]) data data加入某品牌的销售统计量 # 对数据按brand分组结果是每个分组结果组成的结果 train_gb train_data.groupby(brand) all_info {} # 对分组进行循环 for kind, kind_data in train_gb:info {}kind_data kind_data[kind_data[price] 0]# 计算每个品牌汽车的数量、最高价、中位数、最低价、价格总和、价格方差、价格平均值info[brand_amount] len(kind_data)info[brand_price_max] kind_data.price.max()info[brand_price_median] kind_data.price.median()info[brand_price_min] kind_data.price.min()info[brand_price_sum] kind_data.price.sum()info[brand_price_std] kind_data.price.std()info[brand_price_average] round(kind_data.price.sum() / (len(kind_data) 1), 2)all_info[kind] info # 因为字典的键对应的是dataframe的列所以我们要进行转置 brand_fe pd.DataFrame(all_info).T.reset_index().rename(columns{index: brand}) # 将结果合并到我们的原数据中这里采用的是左连接连接条件是brand # 左连接就是说data表显示所有brand_fe表只显示brand值相匹配的行 data data.merge(brand_fe, howleft, onbrand)同理我们还可以加入不同车型、不同燃油类型、不同变速箱、不同地区的销售统计量这里不再一一列举 对power数据进行分桶 为什么要做数据分桶呢 离散后稀疏向量内积乘法运算速度更快计算结果也方便存储容易扩展 离散后的特征对异常值更具鲁棒性如 age30 为 1 否则为 0对于年龄为 200 的也不会对模型造成很大的干扰 LR 属于广义线性模型表达能力有限经过离散化后每个变量有单独的权重这相当于引入了非线性能够提升模型的表达能力加大拟合 离散后特征可以进行特征交叉提升表达能力由 MN 个变量编程 M*N 个变量进一步引入非线形提升了表达能力 特征离散后模型更稳定如用户年龄区间不会因为用户年龄长了一岁就变化 当然还有很多原因LightGBM 在改进 XGBoost 时就增加了数据分桶增强了模型的泛化性 # 创建了一个包含31个元素的列表每个元素是按照10的倍数递增的数字。这个列表将用作分桶的边界 bin [i*10 for i in range(31)] # 第一个参数是要分箱的数据 # 第二个参数是分箱的边界 # 第三个参数labelsFalse表示我们希望返回的结果是分箱后每个样本所在的箱的索引而不是标签。 # 这一行代码的结果将是一个新的Series其中每个元素表示对应样本所在的箱的索引。 data[power_bin] pd.cut(data[power], bin, labelsFalse)导出数据 # 删除不需要的数据 data data.drop([creatDate, regDate, regionCode], axis1) # 目前的数据已经可以给树模型使用了所以先导出一下 data.to_csv(data_for_tree.csv, index0)3.2 为LR NN 之类的模型构造特征 注不同模型对数据集的要求不同所以分开构造 对数值特征做归一化 这里先以power列为例 查看power的分布 data[power].plot.hist()可以发现直方图只有0-2500这一列且该列的值很大猜测数据可能分布不均匀这里我们可以先log数据平滑处理一下再归一化 data[power] np.log(data[power] 1) data[power] ((data[power] - np.min(data[power])) / (np.max(data[power]) - np.min(data[power]))) data[power].plot.hist()其他列这里不再一一列举 这里可以定义一个归一化函数将其他列传入即可 def max_min(x):return (x - np.min(x)) / (np.max(x) - np.min(x))对类别特征进行 OneEncoder # get_dummies是pandas库中用于进行独热编码One-Hot Encoding的函数 data pd.get_dummies(data, columns[model, brand, bodyType, fuelType,gearbox, notRepairedDamage, power_bin]) # 参数 # data: 这是一个DataFrame或者类似于DataFrame的数据结构包含需要进行独热编码的数据。 # columns: 这是一个列表包含需要进行独热编码的列名。函数将对这些列进行独热编码处理查看一下形状发现多了很多列这里需要理解一下get_dummies是怎么进行one-hot编码的比如brand有AB两个类型那么data里面就会把brand转化为AB两个列该行数据属于A类型那么A类型这一列就为1否则为0 print(data.shape) print(data.columns)保存特征 data.to_csv(data_for_lr.csv, index0) # index0表示不在文件中写入行索引4. 特征筛选 过滤式 可单独计算某列特征和标签之间的相关性 # 相关性分析 print(data[power].corr(data[price], methodspearman)) print(data[kilometer].corr(data[price], methodspearman)) print(data[brand_amount].corr(data[price], methodspearman)) print(data[brand_price_average].corr(data[price], methodspearman)) print(data[brand_price_max].corr(data[price], methodspearman)) print(data[brand_price_median].corr(data[price], methodspearman))也可以通过画相关性热力图来看各个特征之间的相关性 data_numeric data[[power, kilometer, brand_amount, brand_price_average, brand_price_max, brand_price_median]] # corr() 方法会计算特征之间的皮尔逊相关系数生成一个相关性矩阵 correlation data_numeric.corr()f , ax plt.subplots(figsize (7, 7)) # 这行代码给图形添加了标题标题内容为 Correlation of Numeric Features with Price # y1 参数将标题的位# 置设置在图形顶部size16 参数指定了标题的字体大小为16号 plt.title(Correlation of Numeric Features with Price,y1,size16) #使用Seaborn库中的 heatmap 函数绘制了热力图。热力图展示了相关性矩阵 correlation 中各特征之间的相关性。 # squareTrue 参数确保热力图是正方形的vmax0.8 参数设置了颜色映射的最大值这有助于突出显示高相关性 sns.heatmap(correlation,square True, vmax0.8)可以看出上述对角线颜色是最浅的因为对角线是特征自己跟自己的相关性power跟brand_price_average, brand_price_max, brand_price_median之间的相关性比跟kilometer, brand_amount之间的相关性更强 包裹式 小编这里这一部分没有跑通暂时没有排查出是哪里出问题了 from mlxtend.feature_selection import SequentialFeatureSelector as SFS from sklearn.linear_model import LinearRegression sfs SFS(LinearRegression(),k_features10,forwardTrue,floatingFalse,scoring r2,cv 0) x data.drop([price], axis1) x x.fillna(0) y data[price] sfs.fit(x, y) sfs.k_feature_names_ # 画出来可以看到边际效益 from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs import matplotlib.pyplot as plt fig1 plot_sfs(sfs.get_metric_dict(), kindstd_dev) plt.grid() plt.show()嵌入式 待补充—— 5. 总结 特征工程的主要目的还是在于将数据转换为能更好地表示潜在问题的特征从而提高机器学习的性能。比如异常值处理是为了去除噪声填补缺失值可以加入先验知识等特征构造也属于特征工程的一部分其目的是为了增强数据的表达有些比赛的特征是匿名特征这导致我们并不清楚特征相互直接的关联性这时我们就只有单纯基于特征进行处理比如装箱groupbyagg 等这样一些操作进行一些特征统计此外还可以对特征进行进一步的 logexp 等变换或者对多个特征进行四则运算如上面我们算出的使用时长多项式组合等然后进行筛选。对于知道特征含义非匿名的特征工程特别是在工业类型比赛中会基于信号处理频域提取丰度偏度等构建更为有实际意义的特征这就是结合背景的特征构建在推荐系统中也是这样的各种类型点击率统计各时段统计加用户属性的统计等等这样一种特征构建往往要深入分析背后的业务逻辑或者说物理原理从而才能更好的找到 magic。
http://www.hkea.cn/news/14305281/

相关文章:

  • 网站建设所用的工具十大高端全屋定制
  • 中国联通网站建设与维护百度上做网站
  • 医联体网站建设集团高端网站
  • 网站设计软件培训怎么样设计素材类网站开发策划书
  • 网站建设注意哪些内容新闻营销
  • 一流的龙岗网站建设网站添加漂浮二维码怎么做
  • 网站建设与运营公司主营业务收入与成本如何提高网站的访问量
  • 苏州有哪些做网站公司好wordpress资源下载类模板
  • 惠州网站设计公司濮阳做网站建设的公司
  • 类似wordpress的建站系统鞍山人才网档案查询系统
  • 网站做防御公司网站首页怎么做
  • 学校网站建设说明材料武邑网站建设公司
  • 开个人网站怎么赚钱做问卷调查的网站有哪些
  • 长沙网站排名技术wordpress学人的冬天
  • 房地产交易网站模版带前台的wordpress模板下载
  • 网站建设公司怎么宣传苏州网络自学网站建设
  • 成全视频免费观看在线看1000集flash网站做seo优化好不好
  • 网站建设方案云盘做网站需要合同吗
  • 哪个网站可以做魔方图片大全百度竞价关键词出价技巧
  • 做神马网站优化网站建设服务多少钱
  • 北京做网站便宜的公司哪家好南京哪家公司做网站
  • 建设网站用户名是什么优钙网logo设计
  • 仙桃住房和城乡建设部网站装修价格
  • ps制作网站效果图手机端网站开发工具
  • 天津做网站那家好河南省监理协会官方网站建设
  • 商城建站流程天津站内关键词优化
  • 建设行业门户网站需要什么条件单位网站建设目的
  • 高埗网站建设公司装修公司最怕三种人
  • 信息产业部网站备案大港网站建设公司
  • 网站推广的基本方法有哪些织梦网站每天被挂马