前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法工程师-特征工程类岗位面试题目

算法工程师-特征工程类岗位面试题目

作者头像
用户9925864
发布2022-07-27 09:18:29
5250
发布2022-07-27 09:18:29
举报
文章被收录于专栏:算法工程师的学习日志

1.怎么去除 DataFrame 里的缺失值?

1) DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)函数作用:删除含有空值的行或列

2) axis:维度,axis=0 表示 index 行,axis=1 表示 columns 列,默认为 0

3) how:"all"表示这一行或列中的元素全部缺失(为 nan)才删除这一行或列,"any"表 示这一行或列中只要有元素缺失,就删除这一行或列

4) thresh:一行或一列中至少出现了 thresh 个才删除。

5) subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有 axis 决定是行还是列)

6) inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。

2.特征无量纲化的常见操作方法

无量纲化:即 nondimensionalize 或者 dimensionless,是指通过一个合适的变量替代,将一个涉及物理量的方程的部分或全部的单位移除,以求简化实验或者计算的目的。常见操作方法(基于 sklearn):

1) 标准化,返回值为标准化后的数据

代码语言:javascript
复制
from sklearn.preprocessing import StandardScaler 
StandardScaler().fit_transform(data) 

2) 区间缩放,返回值为缩放到[0, 1]区间的数据

代码语言:javascript
复制
from sklearn.preprocessingimport MinMaxScaler 
MinMaxScaler().fit_transform(data) 

3) 归一化,返回值为归一化后的数据

代码语言:javascript
复制
from sklearn.preprocessing import Normalizer 
Normalizer().fit_transform(data)

3.如何对类别变量进行独热编码?

很多时候我们需要对类别变量进行独热编码,然后才可以作为入参给模型使用,独热的方式有很多种,这里介绍一个常用的方法 get_dummies,这个方法可以让类别变量按照枚举值生成 N 个(N 为枚举值数量)新字段,都是 0-1 的变量值。以泰坦尼克号的数据集为例,对数据进行预处理操作,见下:

代码语言:javascript
复制
# 导入相关库
import pandas as pd 
import numpy as np
from pandas import Series,DataFrameimport re
# 导入泰坦尼的数据集
data_train = pd.read_csv("./data/titanic/Train.csv") 
# 提取其中几列
data = data_train.loc[:,['PassengerId','Name']]
# 提取称谓
data['Title'] = data['Name'].map(lambda x: re.compile(", (.*?)\.").findall(x)[0]) 
# 定义一个空字典来收集映射关系
title_Dict = {}title_Dict.update(dict.fromkeys(['Capt', 'Col', 'Major', 'Dr', 'Rev'], 'Officer'))
title_Dict.update(dict.fromkeys(['Don', 'Sir', 'the Countess', 'Dona', 'Lady'], 'Royalty'))
title_Dict.update(dict.fromkeys(['Mme', 'Ms', 'Mrs'], 'Mrs'))
title_Dict.update(dict.fromkeys(['Mlle', 'Miss'], 'Miss'))
title_Dict.update(dict.fromkeys(['Mr'], 'Mr'))
title_Dict.update(dict.fromkeys(['Master','Jonkheer'], 'Master'))
data['Title'] = data['Title'].map(title_Dict)
data.Title.value_counts()接下来对字段 Title 进行独热编码,这里使用 get_dummies,生成 N 个 0-1 新字段:# 对字段 Title 进行独热编码,这里使用 get_dummies,生成 N 个 0-1 新字段dummies_title = pd.get_dummies(data['Title'], prefix="Title")
data = pd.concat([data,dummies_title], axis=1)
data.head()

4.如何把“年龄”字段按照我们的阈值分段?

·截断连续型的数值进行截断或者对长尾数据进行对数后截断(保留重要信息的前提下对特征进行截断,截断后的特征也可以看作是类别特征)

·二值化数据分布过于不平衡 空值/异常值过多

·分桶小范围连续数据内不存在逻辑关系,比如 31 岁和 32 岁之间不存在明显的差异,可以归为一类

5.如何根据变量相关性画出热力图?

调用 corr 来实现变量相关性的计算,同时绘制热力图,颜色越深的话,代表相关性越强!

代码语言:javascript
复制
# 人体胸部加速度数据集,标签 activity 的数值为 1-7
'''
1-在电脑前工作 
2-站立、走路和上下楼梯 
3-站立 
4-走路
5-上下楼梯 
6-与人边走边聊
7-站立着说话
'''
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures
df = pd.read_csv('./data/activity_recognizer/1.csv', header=None)
df.columns = ['index','x','y','z','activity']
x = df[['x','y','z']]
y = df['activity']
# 多项式扩充数值变量
poly = PolynomialFeatures(degree=2, include_bias=False,interaction_only=False)
x_poly = poly.fit_transform(x)
pd.DataFrame(x_poly, columns=poly.get_feature_names()).head()
# 查看热力图(颜色越深代表相关性越强) 
%matplotlib inline
import seaborn as sns
sns.heatmap(pd.DataFrame(x_poly,columns=poly.get_feature_names()).corr())

6.如何把分布修正为类正态分布?

数据下载地址:https://www.kaggle.com/c/house-prices-advanced-regression- techniques/data

代码语言:javascript
复制
import pandas as pd
import numpy as np 
# Plots
import seaborn as sns
import matplotlib.pyplot as plt 
# 读取数据集 
train = pd.read_csv(data')
分布情况,可以调用以下的方法来进行绘制:
sns.set_style("white")
sns.set_color_codes(palette='deep')
f, ax = plt.subplots(figsize=(8, 7))
#Check the new distribution 
sns.distplot(train['SalePrice'], color="b");
ax.xaxis.grid(False)
ax.set(ylabel="Frequency")
ax.set(xlabel="SalePrice")
ax.set(title="SalePrice distribution")
sns.despine(trim=True, left=True)
plt.show()


从结果可以看出,销售价格是右偏,而大多数机器学习模型都不能很好地处理非正态分布数据,所以我们可以应用 log(1+x)转换来进行修正。# log(1+x) 转换train["SalePrice_log"] = np.log1p(train["SalePrice"])
sns.set_style("white")sns.set_color_codes(palette='deep')
f, ax = plt.subplots(figsize=(8, 7))
sns.distplot(train['SalePrice_log'] , fit=norm, color="b"); 
# 得到正态分布的参数
(mu, sigma) = norm.fit(train['SalePrice_log']) 
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)], loc='best')
ax.xaxis.grid(False)
ax.set(ylabel="Frequency")
ax.set(xlabel="SalePrice")
ax.set(title="SalePrice distribution")
sns.despine(trim=True, left=True)
plt.show()

7.怎么简单使用 PCA 来划分数据且可视化呢?

PCA,全称为 Principal Component Analysis,也就是主成分分析方法,是一种降维算法,其功能就是把 N 维的特征,通过转换映射到 K 维上(K<N),这些由原先 N 维的投射后的 K 个正交特征,就被称为主成分。使用的数据集 iris

# 导入相关库

代码语言:javascript
复制
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA 
%matplotlib inline
#解决中文显示问题,Mac
%matplotlib inline
from matplotlib.font_manager import FontProperties
# 设置显示的尺寸
plt.rcParams['font.family'] = ['Arial Unicode MS'] 
#正常显示中文 
# 导入数据集
iris = load_iris()
iris_x, iris_y = iris.data, iris.target 
# 实例化
pca = PCA(n_components=2)
# 训练数据
pca.fit(iris_x)
pca.transform(iris_x)[:5,] 
# 自定义一个可视化的方法
label_dict = {i:k for i,k in enumerate(iris.target_names)}
def plot(x,y,title,x_label,y_label): 
    ax = plt.subplot(111) 
    for label,marker,color in zip( range(3),('^','s','o'),('blue','red','green')): 
    plt.scatter(x=x[:,0].real[y == label], y = x[:,1].real[y == label], color = color, alpha = 0.5, label = label_dict[label] ) 
    plt.xlabel(x_label) 
    plt.ylabel(y_label) 
    leg = plt.legend(loc='upper right', fancybox=True) 
    leg.get_frame().set_alpha(0.5) 
    plt.title(title)
# 可视化
plot(iris_x, iris_y,"原始的 iris 数据集","sepal length(cm)","sepal width(cm)") 
plt.show()
plot(pca.transform(iris_x), iris_y,"PCA 转换后的头两个正交特征","PCA1","PCA2") 

8.怎么简单使用 LDA 来划分数据且可视化呢?

LDA 的全称为 Linear Discriminant Analysis, 中文为线性判别分析,LDA 是一种有监督学习的算法,和 PCA 不同。PCA 是无监督算法,。LDA 是“投影后类内方差最小,类间方差最大”,也就是将数据投影到低维度上,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。使用的数据集 iris

代码语言:javascript
复制
# 导入相关库
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
%matplotlib inline
#解决中文显示问题,Mac
%matplotlib inline
from matplotlib.font_manager import FontProperties
# 设置显示的尺寸
plt.rcParams['font.family'] = ['Arial Unicode MS'] 
#正常显示中文 
# 导入数据集
iris = load_iris()iris_x, iris_y = iris.data, iris.target
# 实例化
lda = LinearDiscriminantAnalysis(n_components=2)
# 训练数据
x_lda_iris = lda.fit_transform(iris_x, iris_y) 
# 自定义一个可视化的方法
label_dict = {i:k for i,k in enumerate(iris.target_names)}
def plot(x,y,title,x_label,y_label): ax = plt.subplot(111) 
    for label,marker,color in zip( range(3),('^','s','o'),('blue','red','green')): 
    plt.scatter(x=x[:,0].real[y == label], y = x[:,1].real[y == label], color = color, alpha = 0.5, label = label_dict[label] ) 
    plt.xlabel(x_label) 
    plt.ylabel(y_label) 
    leg = plt.legend(loc='upper right', fancybox=True) 
    leg.get_frame().set_alpha(0.5) 
    plt.title(title)
# 可视化
plot(iris_x, iris_y,"原始的 iris 数据集","sepal length(cm)","sepal width(cm)") 
plt.show()
plot(x_lda_iris, iris_y, "LDA Projection", "LDA1", "LDA2")
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档