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) 标准化,返回值为标准化后的数据
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(data)
2) 区间缩放,返回值为缩放到[0, 1]区间的数据
from sklearn.preprocessingimport MinMaxScaler
MinMaxScaler().fit_transform(data)
3) 归一化,返回值为归一化后的数据
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(data)
3.如何对类别变量进行独热编码?
很多时候我们需要对类别变量进行独热编码,然后才可以作为入参给模型使用,独热的方式有很多种,这里介绍一个常用的方法 get_dummies,这个方法可以让类别变量按照枚举值生成 N 个(N 为枚举值数量)新字段,都是 0-1 的变量值。以泰坦尼克号的数据集为例,对数据进行预处理操作,见下:
# 导入相关库
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 来实现变量相关性的计算,同时绘制热力图,颜色越深的话,代表相关性越强!
# 人体胸部加速度数据集,标签 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
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
# 导入相关库
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
# 导入相关库
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")