谢谢你留下时光匆匆
Programming with Python for Data Science学习笔记

本文写于本人在EdX平台上学习Programming with Python for Data Science课程过程中。该课程主要讲述如何利用Python进行数据科学实践,内容涵盖Pandas、Sciki-learn等数据科学中常用包的主要命令,并结合实际数据集进行实战操作。在学习过程中,我将课程中学习到、代码作业中所遇到的命令在此进行归纳总结,以方便后面学习者查阅。另外该门课程中所用到命令也常在实际操作中用到,亦可将本文作为数据科学工作中的参考资料。

本文按照课程学习顺序对命令进行排序。另外命令方法的参数并未列全,只列出常用参数,更多参数功能可参见官方文档。

另外,我将课程Lab上机作业的代码放在我Github上托管DAT210,若有需要,可供参考。

数据预处理

数据读入

读入csv等文本文件pd.read_csv()

1
2
3
import pandas as pd

df = pd.read_csv('FilePath', header = None, names = ['ColunName_1', 'ColunName_N' ], sep = ',', index_col = 0, na_values = '?')

读入数据文件,转换为Dataframe格式,赋予df名称。位置参数'FilePath'指定数据文件路径;关键字参数header指定文件中,数据Feature的名称所在的行数,None表示数据文件中没有包含Feature的名称;参数names手动赋予Feature的名称;参数sep指定数据文件中的分隔符;参数index_col指定样本标签(唯一确定某条样本信息)所在的列数。

读入html网页中的表格pd.read_html()

1
df = pd.read_html('URL')[0]

从网页中读入一系列表格,转换为DataframeList,取其中元素赋予df名称。位置参数'URL'指定读入网页的网址,注意可能需将https改为http,以匹配符合的协议。

读入图像文件

1
2
3
4
5
6
from scipy import misc

sample = []
img = misc.read('FilePath')    #读取文件
sample.append((img / 255.0).reshape(-1))      #将文件转换至一维数组
df = pd.DataFrame(sample)          #转化为Dataframe格式

Dataframe数据集概览操作

浏览具体数据df.head()df.tail()

1
2
df.head(Num)
df.tail(Num)

返回df中前/后几行数据具体情况。位置参数Num指定行数。

数值特征的统计量df.describe()

1
df.describe()

返回df中数值特征的相关统计量,包括样本量、最大(小)值、平均值、标准差、四分位数。在统一Feature Scaling 前可以用此命令观察数据的特点。

浏览数据集中的特征df.columnsdf.dtypes

1
2
df.colunms
df.dtypes

df,columns返回df中特征的名称,df.dtypes返回df中特征的名称以及对应储存数据的类型。在导入数据过程中,可能因为各种原因所期望的数据类型与实际数据类型不同,会影响后面命令的执行,这时需要对进行数据类型转换。注意上述命令是df的属性,而非df的方法,即命令后无()

Feature的所有取值df.feature.unique()

1
df.feature_name.unique()

返回数据集dffeature_name属性的所有取值。

数据集切片

常规切片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#选取某些纵列,即选取全部样本的某些Feature
#以下命令返回Series对象,假设选取Feature名为'recency'的第0纵列,
df.recency
df['recency']
df.loc[:,'recency']
df.iloc[:,0]
df.ix[:,0]

#以下命令返回Dataframe对象
df.[['recency']]
df.loc[:,['recency']]
df.iloc[:,[0]]

#选取某些行,即选取某些样本的全部Feature
df[0:2]
df.loc[0:2,:]

条件选取切片

1
df[(df.recency < 7) & (df.newbie == 0)]

返回df数据集中'recency'属性小于7且'newbie'属性等于0的样本

数据集整理

数据集Feature名称修改

1
df.columns = ['Feature_1','Feature_2']

有序分类Feature转换

1
2
3
4
#下面以satisfaction属性为例
ordered_satisfaction = ['Very Unhappy', 'Unhappy', 'Neutral', 'Happy', 'Very Happy']
df.satisfaction = df.satisfaction.astype("category",
                                         ordered=True,categories=ordered_satisfaction).cat.codes

df数据集中分类Featuresatisfaction从文本属性转换为整数表示,1对应'Very Unhappy',5对应'Very Happy',-1表示无对应。astype("category", ordered = True, categories = ordered_satisfaction)方法将Series按照categories参数转换为有序的category类型,cat.codescategory类型所对应的数字编码。

无序分类Feature转换pd.get_dummies()

1
df = pd.get_dummies(df,columns=['column_1','column_2'])

将数据集df中无序分类Featurecolumn_1column_2转换为dummy表示(0/1表示)。位置参数df指定待操作的数据集;关键字参数columns指定待操作的Feature。

缺省Nan值替换df.fillna()df.feature.fillna()

1
2
3
#df.fillna()与df.feature.fillna()参数相同,下例只说明前者
df.fillna(0)
df.fillna(method = 'ffill', limit = 5)

第一行命令将数据集df中的所检索到的Nan值用0替换掉。第二行命令将数据集df中所检索到的Nan值用前一条样本的对应值替代,关键字参数method指定替代的方法,limit指定替换的最大间隔(在连续多个数据都为Nan时用到),具体方法参见官方文档

数据剔除df.drop()df.dropna()

1
2
df = df.dropna(axis = 0, thresh = 5)
df = df.drop(labels=['column_1','column_2'],axis = 1)

第一行命令将df数据集中有5项及其以上属性为Nan的数据剔除,关键字参数axis指定剔除数据集的行(样本)或列(属性),0表示剔除行,1表示剔除列,thresh指定当出现多少Nan值时剔除该项。第二行命令剔除df数据集中'column_1''column_2'属性,关键字参数label指定所剔除的项,axis指定剔除数据集的行(样本)或列(属性),0表示剔除行,1表示剔除列。

数据类型转化pd.to_numeric()

1
df.Num = pd.to_numeric(df.Num, errors = 'coerce')

将数据集dfNum属性下数据转换为相应的数值类型。位置参数指定所有转化的Series,关键字参数errors指定处理错误的方式,'coerce'将无法转化的值转化为Nan。在读取数据时,需要特别注意,往往所期望的数据类型与实际的数据类型不一致,这会导致数据处理上的错误,这要求需要对处理数据前,检查数据类型,并转化为所期望的数据类型。

数据编号重排reset_index()

1
df.reset_index(drop = True, inplace = True)

将数据集df的编号重新编排。关键字参数drop指定是否保留原有的编号,参数inplace指定是否在原有数据集上操作,或返回一个新的数据集。当对样本进行剔除后,数据集样本编号不会随之变动,利用reset_index()方法对数据集编号进行重新编排。

数据特征缩放Feature Scaling

1
2
3
4
5
from sklearn.preprocessing import Normalizer

norm = Normalizer()
norm.fit(df)
df = norm.transform(df)

Normalize数据特征,使得数据在同一Scale下,在K近邻算法,PCA主成分降维算法等中常用到。除Normalizer方法外,常用特征放缩方法还有MinMaxScaler,RobustScaler,StandardScaler

数据训练集与测试集分离train_test_split()

1
2
3
4
from sklearn.model_selection import train_test_split

data_train, data_test, label_train, label_test = train_test_split(data, labels,
                                                                  test_size=0.5)

将训练样本data与其对应标签labels随机分成训练集、测试集。关键字参数test_size指定测试集占总样本的比例。

数据可视化

基础图像绘制

条形图Histogramsdf.plot.hist()

1
2
3
4
5
import pandas as pd
import matplotlib
matplotlib.style.use('ggplot') #制定图像绘制风格

df.plot.hist(alpha = 0.5)

绘制数据集df上条形图,关键字参数alpha制定柱形的透明程度,0表示完全透明,1表示完全不透明。

二维散点图2D-Scatterdf.plot.scatter()

1
2
3
4
import pandas as pd
import matplotlib

df.plot.scatter(x = 'feature_1', y = 'feature_2')

绘制数据集df上关于属性'feature_1''feature_2'的散点图,关键字参数xy指定需要作出散点图的两个数据集的Feature。

三维散点图3D-Scatterdf.plot.scatter()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from mpl_tookits.mplot3d import Axes3D

fig = plt.figure()      #生成figure类的实例fig
ax = fig.add_subplot(111, projection = '3d')   #在fig上添加图,设置为3d坐标图
ax.set_xlabel('xlabel')    #设置xyz坐标轴的名称
ax.set_ylabel('ylabel')
ax.set_zlabel('zlabel')
ax.scatter(df.feature_1, df.feature_2, df.feature_3, c='r', marker = '.')  
#绘制三维图,关键字参数c制定散点的颜色,参数marker制定散点图案类型
plt.show()   #显示绘制图像

绘制关于数据集df的三个属性feature_1``feature_2``feature_3的三维散点图。注意Pandas并未自带的绘制三维散点图的方法。

高维数据图像绘制

Parallel Coordinate parallel_coordinates()

1
2
3
plt.figure()
parallel_coordinates(df, 'cat_names')
plt.show()

绘制数据集df的Parallel Coordinate图像,位置参数df制定绘制的数据集,参数cat_names指定分类所依据的Feature。注意Matplotlib包的parallel_coordinates所绘制的所有纵坐标量级尺度都是一样,无法不同Feature不同处理。

Andrew’s Curves andrews_curves()

1
2
3
4
5
from pandas.tools.plotting import andrews_curves

plt.figure()
andrews_curves(df, 'cat_names')
plt.show()

绘制数据集df的Andrew’s Curves图像,位置参数df制定绘制的数据集,参数cat_names指定分类所依据的Feature。

Imshow plt.imshow()

1
2
3
4
5
6
7
8
#绘制图像
plt.imshow(df.corr(), cmap=plt.cm.Blues, interpolation='nearest')
#以下设置坐标名称
tick_marks = [i for i in range(len(df.columns))]
plt.xticks(tick_marks, df.columns, rotation='vertical')
plt.yticks(tick_marks, df.columns)
#显示图像
plt.show()

绘制数据集df相关矩阵的Imshow图像。Imshow图像可用于找出相关程度较高的一组Feature。

数据转换

主成分分析PCA

1
2
3
4
5
from sklearn.decomposition import PCA

pca = PCA(n_components = 2, svd_solver = 'full')
pca.fit(df)
T = pca.transform(df)

根据设置,利用数据集df训练模型,并将训练后的模型应用于数据集df上,返回的结果储存于TPCA()生成PCA类实例,参数n_component指定最后主成分个数,svd_solver指定模型运算算法。fit()方法将df数据集应用于模型上。transform()方法将df按照训练后的模型转化为新的数据集。

流形降维Isomap

1
2
3
4
5
from sklearn import manifold

iso = manifold.Isomap(n_neighbors = 5, n_components = 3)
iso.fit(df)
T = iso.transform(df)

根据参数设置,利用数据集df训练模型,并将训练后的模型应用于数据集df上,返回的结果储存于TIsomap()生成Isomap类实例,参数n_neighbors指定邻域节点数,参数n_component指定最后主成分个数。fit()方法将df数据集应用于模型上。transform()方法将df按照训练后的模型转化为新的数据集。

机器学习算法

聚类K-Means

1
2
3
4
5
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters = 5, n_init = 10)
kmeans.fit(df)
kmeans.cluster_centers_

根据参数设置,利用数据集df训练模型,并将训练后的模型应用于数据集df上,返回的结果储存于TKMeans()生成KMeans类实例,参数n_clusters指定分类数,参数n_init指定算法重复执行次数。fit()方法将df数据集应用于模型上。属性cluster_centers_返回训练后模型的各类中心点坐标。

K近邻K-Nearest Neighbors

1
2
3
4
5
from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=3, weights = 'uniform')
model.fit(X_train, y_train) 
model.score(X_test, y_test)

根据参数设置,利用数据集X_train与其对应标签y_train训练模型。KNeighborsClassifier()生成KNeighborsClassifier类实例,参数n_neighbors指定预测数据距离最近的训练样本的数量,参数weights指定最近样本决定预测数据的方式,uniform表示所有样本权重一致,此外还有distance,表示样本按距离远近的倒数赋予相应权值。score()方法返回模型在测试集上的准确率。

线性回归Linear Regression

1
2
3
4
5
from sklearn import linear_model

model = linear_model.LinearRegression()
model.fix(X_train, y_train)
model.score(X_test, y_test)

根据参数设置,利用数据集X_train与其对应标签y_train训练模型。LinearRegression()生成LinearRegression类实例,score()方法返回模型在测试集上的准确率,即计算R平方值。

支持向量机SVM

1
2
3
4
5
from sklearn.svm import SVC

model = SVC(kernel = 'linear',C = 1.0 gamma = 0.1)
model.fix(X_train, y_train)
model.score(X_test, y_test)

根据参数设置,利用数据集X_train与其对应标签y_train训练模型。SVC()生成SVC类实例,参数kernel指定kernel函数,参数C指定错误惩罚程度,该参数越大,对错误样本惩罚值越高,越可能导致过度拟合。score()方法返回模型在测试集上的准确率,即计算R平方值。

决策树Decision Tree

1
2
3
4
5
from sklearn import tree

model = tree.DecisionTreeClassifier(max_depth = 5, criterion = 'entropy')
model.fit(X_train, y_train)
tree.export_graphviz(model.tree_, out_file='tree.dot', feature_names=X.columns)

根据参数设置,利用数据集X_train与其对应标签y_train训练模型。DecisionTreeClassifier()生成DecisionTreeClassifier类实例,参数max_depth指定树的深度;参数criterion指定树分支的计算指标,默认为Gini系数,‘entropy’计算商。tree.export_graphviz()方法输出训练后模型的可视化图像文件,该图像文件需系统中安装树可视化软件graphviz

随机森林Random Forest

1
2
3
4
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators = 10)
model.fit(X_train, y_train)

根据参数设置,利用数据集X_train与其对应标签y_train训练模型。参数n_estimators指定随机森林中数的数量。

模型评价与整合

Confusion Metrix

1
2
3
import sklearn.metrics as metrics

metrics.confusion_matrix(y_true, y_pred)

输出度量Confusion Metrix,每行表示每类实际结果的预测分布情况,每列表示每类预测结果的实际值分布情况。以下给出Confusion Metrix与imshow图像的结合应用的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt

columns = ['Cat', 'Dog', 'Monkey']
confusion = metrics.confusion_matrix(y_true, y_pred)

plt.imshow(confusion, cmap=plt.cm.Blues, interpolation='nearest')
plt.xticks([0,1,2], columns, rotation='vertical')
plt.yticks([0,1,2], columns)
plt.colorbar()

plt.show()

验证Validation

度量矩阵

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import sklearn.metrics as metrics
y_true = [1, 1, 2, 2, 3, 3]
y_pred = [1, 1, 1, 3, 2, 3]

# recall = true_positives / (true_positives + false_negatives)
metrics.recall_score(y_true, y_pred, average='weighted')   #average参数用于指定各类平均方法
# precision = true_positives / (true_positives + false_positives)
metrics.precision_score(y_true, y_pred, average=None)
# F1 = 2 * (precision * recall) / (precision + recall)
metrics.f1_score(y_true, y_pred, average='weighted')

target_names = ['name 1', 'name 2', 'name 3']
metrics.classification_report(y_true, y_pred, target_names=target_names)

Cross Validation

1
2
3
from sklearn import cross_validation as cval
cval.cross_val_score(model, X_train, y_train, cv=10) #返回每组的训练集下的准确度 cv制定分组数
cval.cross_val_score(model, X_train, y_train, cv=10).mean() #返回平均值
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from sklearn import grid_search

parameters = {'kernel':('linear', 'rbf'), 'C':[1, 5, 10]}
model = svm.SVC()
classifier = grid_search.GridSearchCV(model, parameters)  
classifier.fit(X_train, y_train)
#以上根据参数的可能性,进行组合比较训练,得到最佳的模型参数

parameter_dist = {
  'C': scipy.stats.expon(scale=100),
  'kernel': ['linear'],
  'gamma': scipy.stats.expon(scale=.1),
}
classifier = grid_search.RandomizedSearchCV(model, parameters_dist)  
classifier.fit(X_train, y_train)
#以上根据参数的所指定的分布,进行组合比较训练,得到最佳的模型参数

模型Pipeline

1
2
3
4
5
6
from sklearn.pipeline import Pipeline
svc = svm.SVC(kernel='linear')
pca = RandomizedPCA()
pipeline = Pipeline([('pca', pca),('svc', svc)])
pipeline.set_params(pca__n_components=5, svc__C=1, svc__gamma=0.0001)
pipeline.fit(X, y)

将多个模型由前至后连接,整合成一个机器学习模型。需要注意的是中间模型需要有.fit() .transform()方法 ,如果原类无对应方法,可以自定义相对应的方法,以适应Pipeline的运行。