个人总结:
1.比赛;2.专业知识;3.实习;4.课题研究【风场反演程序调试】5.一些建议QA
------------------------------------------------------------------------------------------------------------------------------------------------------
【比赛】
天池、Kaggle、数据城堡、JDD、CCF以及一些公司(腾讯、华为、科大讯飞、hulu等)每年都会举办一些比赛。
可以通过关注一些公众号来及时获得信息(直接搜对应名字可找到公众号,可以第一时间获得比赛信息)
挖掘幸福感(练手比赛)
------------------------------------------------------------------------------------------------------------------------------------------------------
【专业知识】
1.书籍:李航-统计学习方法、周志华-西瓜书(机器学习)、没学过数据结构的一定要看数据结构
2.CSDN、牛客网、GitHub、天池技术圈等
3.顶会论文阅读(
)
4.至少熟悉使用Pandas、Numpy这两个库
5.数据挖掘与机器学习一般步骤:(不包括深度学习)
为了方便后面的代码表示,这里假设训练集为train,对应的标签(label)为target,测试集为test。
大致可以分为四个步骤:数据预处理、特征工程、模型选择、分析评估。
个人经验最重要的是数据,它决定了机器学习的上限,模型只是无限的逼近这个上限而已。
目的:(1)原始数据存在脏数据,比如某列应该是int型数据,混入了字符数据等,脏数据一般都会存在并且种类繁多,需要具体情况具体对待。【数据清洗】
(2)数据中有可能存在异常值。
统计学上一般认为异常点大多数出现在离群点中,离群点
常用的检测方法有:
常用的异常值的检测方法参考这篇博客:https://blog.csdn.net/u013719780/article/details/48901183
孤立森林(iForest)
算法原理:随机选择样本,随机选择一个特征,在该特征[min,max]范围内选择一个值二分数据集,再选择其他特征对已经二分的数据集继续执行上述操作,从而递归生成一棵二叉搜索树,iTree认为一般离根节点近的点认为是离群点的可能性大。
iForest==>Python代码
箱线图(Box-plot)
算法思想:认为更加靠拢的数据更偏向于正常,过大过小的数据偏向于异常。能够起到平滑数据的作用。
箱线图主要由五条基线构成:上边缘、上四分位(Q3)、中位数、下四分位(Q1)、下边缘。极差IQR=1.5*(Q3-Q1),上边缘=Q3+IQR,下边缘=Q1-IQR,所有介于上边缘和下边缘之外的数据点认为是异常点。
箱线图==>Python代码
画图法
简单有效的检测异常值的方法是画图,将数据可视化一般离群点很有可能就是异常值。画图需要掌握的第三方库:
import matplotlib.pyplot as plt
注:异常值检测有时候可能带来相反的效果,因为特殊情况如果被视为异常则很容易导致模型失去一部分的学习能力。
(3)原始数据无法直接运用到模型中。比如常见的线性模型如线性回归、逻辑回归就无法处理缺失值,因此需要对缺失值处理。
比如我们对所有的缺失值填充-1,这是最简单的处理方法。
train.fillna(-1)
test.fillna(-1)
若是对某列比如'A'列进行缺失值填充:
train['A'].fillna(-1)
test['A'].fillna(-1)
如果想填充均值、中位数、众数:
train['A'].fillna(train['A'].mean())
train['A'].fillna(train['A'].median())
train['A'].fillna(train['A'].mode())
目的:挖掘有用数据,构造新的特征向量,它是数据挖掘与机器学习的核心。栗子:体质指数BMI=体重(Kg)/身高(m)平方
详细看这里:https://blog.csdn.net/jainszhang/article/details/80562657
特征工程主要包括:特征构造、特征选
特征构造
特征构造主要基于对业务的理解,其实也是在有现成数据之后最为重要的一个过程。 最简单的特征构造可以是特征之间的四则运算,比如在判断孕妇是否有糖尿病时,身高和体重的组合(体重/身高的平方)是一个重要的指标,像这些指标则需要我们头脑风暴挖掘出来。 【Tips:用模型输出特征重要性,围绕重要性高的特征构造新的特征往往效率比较高】
特征选择
原始特征以及我们构造的特征往往并不是越多越好,有些特征可能是噪声特征,有些特征和其他特征相关性过高,这些都可能会导致模型的精确度降低,这时需要进行特征选择。特征选择简单说就是删去无用冗余影响模型精度的特征。
特征选择方法:
Ⅰ删除缺失值过多的列;
Ⅱ删除值单一的列;
Ⅲ删除方差过小的列;
Ⅳ根据皮尔逊相关系数检测列之间的线性相关性(这种方法实用性不是非常高,因为它只能检测线性相关性)
V模型法(根据模型输出的特征重要性做筛选)
Ⅵ其他还有不少特征选择的方法,作为入门掌握上面五种差不多了,而且上面这几种也是最常用的。
原则:选择什么样的模型需要看模型在测试集上的表现效果。
线性回归:
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(train, target)
clf.predict(test)
逻辑回归:
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(train, target)
clf.predict(test)
决策树(回归):
from sklearn.tree import DecisionTreeRegressor
clf = DecisionTreeRegressor()
clf.fit(train, target)
clf.predict(test)
决策树(分类):
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(train, target)
clf.predict(test)
SVM(回归):
from sklearn import svm
clf = svm.SVR()
clf.fit(train, target)
clf.predict(test)
SVM(分类):
from sklearn import svm
clf = svm.SVC()
clf.fit(train, target)
clf.predict(test)
随机森林(回归):
from sklearn.ensemble import RandomForestRegressor
clf = RandomForestRegressor()
clf.fit(train, target)
clf.predict(test)
随机森林(分类):
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(train, target)
clf.predict(test)
GBDT(回归):
from sklearn.ensemble import GradientBoostingRegressor
clf = GradientBoostingRegressor()
clf.fit(train, target)
clf.predict(test)
GBDT(分类):
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier()
clf.fit(train, target)
clf.predict(test)
lightGBM:
import lightgbm as lgb
import numpy as np
from sklearn.model_selection import KFold
param = {'num_leaves': 32,
'min_data_in_leaf': 50,
'objective': 'regression',
'max_depth': -1,
'boosting_type': 'gbdt',
'learning_rate': 0.01,
"min_child_samples": 10,
"feature_fraction": 0.8,
"bagging_freq": 1,
"bagging_fraction": 0.9,
"bagging_seed": 7,
"metric": 'mae',
"lambda_l1": 0.1,
"verbosity": -1}
folds = KFold(n_splits=5, shuffle=True, random_state=2019)
oof_lgb = np.zeros(len(train))
predictions_lgb = np.zeros(len(test))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(train, target)):
print("fold n_{}".format(fold_ + 1))
trn_data = lgb.Dataset(train[trn_idx], target[trn_idx])
val_data = lgb.Dataset(train[val_idx], target[val_idx])
num_round = 10000
clf = lgb.train(param, trn_data, num_round, valid_sets=[trn_data, val_data], verbose_eval=200,
early_stopping_rounds=200)
oof_lgb[val_idx] = clf.predict(train[val_idx], num_iteration=clf.best_iteration)
predictions_lgb += clf.predict(test, num_iteration=clf.best_iteration) / folds.n_splits
xgboost:
import xgboost as xgb
import numpy as np
from sklearn.model_selection import KFold
xgb_params = {'eta': 0.01, 'max_depth': 7, 'subsample': 0.9, 'colsample_bytree': 0.9,
'objective': 'reg:linear', 'eval_metric': 'mae', 'silent': True, 'nthread': 4}
folds = KFold(n_splits=5, shuffle=True, random_state=2018)
oof_xgb = np.zeros(len(train))
predictions_xgb = np.zeros(len(test))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(train, target)):
print("fold n°{}".format(fold_ + 1))
trn_data = xgb.DMatrix(train[trn_idx], target[trn_idx])
val_data = xgb.DMatrix(train[val_idx], target[val_idx])
watchlist = [(trn_data, 'train'), (val_data, 'valid_data')]
clf = xgb.train(dtrain=trn_data, num_boost_round=20000, evals=watchlist, early_stopping_rounds=100,
verbose_eval=100, params=xgb_params)
oof_xgb[val_idx] = clf.predict(xgb.DMatrix(train[val_idx]), ntree_limit=clf.best_ntree_limit)
predictions_xgb += clf.predict(xgb.DMatrix(test), ntree_limit=clf.best_ntree_limit) / folds.n_splits
表现效果(评价指标):
回归:MSE、RMSE、MAE等
分类:AUC、logloss、f1-score等
通过交叉验证的方法可以观察模型在训练集上的表现效果,如果训练集和测试集的数据分布基本一致,那么模型在训练集和测试集上的表现效果一般相差不大。
一般使用K-折交叉验证。
【Tips】对于一些回归问题,涉及到随机种子的可以多取几次种子得到结果取平均值,一般效果都会略有提高。
------------------------------------------------------------------------------------------------------------------------------------------------------
【课题研究】
代码调试。
------------------------------------------------------------------------------------------------------------------------------------------------------
【实习】
实习一定要去大厂!大厂!大厂!加分项!加分项!加分项!
实习和秋招一样,流程都一样,所以也是对秋招的提前适应。可以先找一些不是非常想去的公司练练手(面了京东、京东金融、百度、阿里)。多关注牛客网以及微信群公众号的信息。
------------------------------------------------------------------------------------------------------------------------------------------------------
【一些建议】
面试要掌握的点:
基础知识【根据具体岗位看基础知识+面经】
漂亮的简历(简历模板+项目)
刷题【leetcode、牛客网】
面试技巧(要跟面试官聊得来,不要让场面很尴尬,不要顶撞面试官,态度要诚恳)
------------------------------------------------------------------------------------------------------------------------------------------------------
感谢研究生阶段两位导师的指导与帮助以及一起奋战的小伙伴们。最终拿到offer情况【百度(sp~ssp)、京东(ssp)、华为(ssp15级)、平安科技(sp)、海康威视(五面给了白菜价)、中国银联(总包28W开发岗)、奇虎360+新浪面试通过薪资没谈好】