在飞浆平台上成功运行出pandas-profiling啦~
首先一键安装
pip install ydata_profiling
然后演示,可以生成一个网页对数据有一个比较好的理解
import numpy as np
import pandas as pd
from ydata_profiling import ProfileReport
train_power = pd.read_csv('/home/aistudio/work/data/train/power.csv')
profile = ProfileReport(train_power, title="Profiling Report")
profile.to_file('report.html')
出来啦
试试调参效果
算了算了还是不调了效果真不行
试试利用上下值填充缺失值
#利用上下值填充缺失值
train_data.fillna(method='bfill',inplace = True)
test_data.fillna(method='bfill',inplace = True)
去掉f3
#去掉f3
train_df.drop('f3',axis = 1,inplace = True)
test_df.drop('f3',axis = 1,inplace = True)
#绘制直方图和Q-Q图,查看训练集数据正态分布情况
train_cols =6
train_rows =len(train_df.columns)
plt.figure(figsize=(4*train_cols,4*train_rows))
i=0
for col in train_df.columns:
i+=1
ax=plt.subplot(train_rows,train_cols,i)
sns.distplot(train_df[col],fit=stats.norm)
i+=1
ax = plt.subplot(train_rows,train_cols,i)
res = stats.probplot(train_df[col],plot=plt)
plt.tight_layout()
plt.show()
同样,查看测试集的情况
#绘制直方图和Q-Q图,查看测试集数据正态分布情况
test_cols =6
test_rows =len(test_df.columns)
plt.figure(figsize=(4*test_cols,4*test_rows))
i=0
for col in test_df.columns:
i+=1
ax=plt.subplot(test_rows,test_cols,i)
sns.distplot(test_df[col],fit=stats.norm)
i+=1
ax = plt.subplot(test_rows,test_cols,i)
res = stats.probplot(test_df[col],plot=plt)
plt.tight_layout()
plt.show()
了解到一个自动调参工具openbox,但是我还不会用只下载成功了它的包
以下是来自Datawhale直播关于如何给模型调参
什么是超参数?
在机器学习的过程中,
超参= 在开始机器学习之前,就人为设置好的参数。
模型参数=通过训练得到的参数数据。
通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
参数与超参数的区别:
模型参数是模型内部的配置变量,需要用数据估计模型参数的值,就像机器学习模型中的权重和偏差,是模型根据数据自动学习的;
模型超参数是模型外部的配置,需要手动设置超参数的值,像机器学习中的学习率、模型复杂度等设置。
常见超参数:
梯度下降法中的学习速率α
决策树模型中树的深度d
正则化系数λ
…
机器学习中一直说的“调参”,实际上不是调“参数”,而是调“超参数”。
常用调参方法:
经验调参
经验调参调的是以下框框中的参,结合数据情况及算法的理解,优化调参的优先顺序及参数的经验值
网格调参
简单来讲,网格搜索是一种调参手段,它利用的是一种十分简单暴力的方法:穷举搜索。在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。
实例代码:
from sklearn.model_selection import GridSearchTV
knn = KNeighborsClassifier()
grid_param = {'n_neighbors':list(range(2,11)),
'algorithm':['auto','ball_tree','kd_tree','brute']}
grid = GridSearchTV(knn,grid_param,cv = 5)
grid.fit(X_train,y_train)
grid.best_params_
grid.best_score_
grid.cv_results_['params']
grid.cv_results_['mean_test_score']
怎么办俺觉得都是干货,都想给它拿过来~
小熊老师说贝叶斯优化和automlyyds!!!我也要尝试尝试
贝叶斯优化
贝叶斯优化用于机器学习调参由J. Snoek(2012)提出,主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布。
简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。
安装
!pip install bayesian-optimization
from skopt import BayesSearchCV
import warnings
warning.filterwarnings('ignore')
#参数范围由以下之一指定
from skopt.space import Real,Categorical,Integer
knn = KNeighborsClassifier()
#定义超参数网格
grid_param = {'n_neighbors':list(range(2,11)),'algorithm':['auto','ball_tree','kd_tree','brute']}
#初始化贝叶斯搜索
Bayes = BayesSearchCV(knn,grid_param,n_iter=30,random_state=14)
Bayes.fit(X_train,y_train)
#最佳参数组合
Bayes.best_params_
#使用最佳参数组合达到的得分
Bayes.best_score_
#所有超参数的组合
Bayes.cv_results_['params']
#交叉验证的平均得分
Bayes.cv_results_['mean_test_score']
AutoML
!pip install -U autogluon
from autogluon.tabular import TabularDataset,TabularPredictor
import pandas as pd
# 读取数据
train_power_forecast_history = pd.read_csv('./data/train/power_forecast_history.csv')
train_power = pd.read_csv('./data/train/power.csv')
train_stub_info = pd.read_csv('./data/train/stub_info.csv')
test_power_forecast_history = pd.read_csv('./data/test/power_forecast_history.csv')
test_stub_info = pd.read_csv('./data/test/stub_info.csv')
# 聚合数据
train_df = train_power_forecast_history.groupby(['id_encode','ds']).head(1)
del train_df['hour']
test_df = test_power_forecast_history.groupby(['id_encode','ds']).head(1)
del test_df['hour']
tmp_df = train_power.groupby(['id_encode','ds'])['power'].sum()
tmp_df.columns = ['id_encode','ds','power']
# 合并充电量数据
train_df = train_df.merge(tmp_df, on=['id_encode','ds'], how='left')
### 合并数据
train_df = train_df.merge(train_stub_info, on='id_encode', how='left')
test_df = test_df.merge(test_stub_info, on='id_encode', how='left')
label = 'power'
save_path = './model'
metric = 'root_mean_squared_error'
predictor = TabularPredictor(label=label,path=save_path,eval_metric=metric).fit(train,presets='good_quality')
predictor.leaderboard(train,silent=True)
y_pred = predictor.predict(test)
test_df['power'] = y_pred
test_df['power'] = test_df['power'].apply(lambda x: 0 if x<0 else x)
test_df[['id_encode','ds','power']].to_csv('result.csv',index=False)
特征工程
特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们建立的模型在未知数据上的表现性能可以达到最优(或者接近最佳性能)。从数学的角度来看,特征工程就是人工地去设计输入变量X。
简而言之,将数据转换为能够更好地表示潜在问题的特征,从而提高机器学习性能的过程。
- 转换数据:从原始问题开始,进行数据的过滤后,最终进行数据编码转换等,特征工程使用任何阶段的数据
- 特征:特征是对机器学习建模有意义的数据属性。比如,自然数编号1-2-3或者姓名等一般都是无效的字段,一般不做特征处理。
- 更好地表示潜在问题,提高性能:特征工程的最终目的是获取更有价值的数据,挖掘更加的数据模式,让模型取得更好地效果。