Jupyter视频演示数据操作和数据可视化
截图


您可以从此链接以“ bank.csv”的名称下载数据文件,在该文件中可以找到该数据集的详细说明。在描述数据文件之前,我们先将其导入并查看基本形状。
import pandas as pd bankdf = pd.read_csv('bank.csv',sep=';') # check the csv file before to know that 'comma' here is ';' print bankdf.head(3) print list(bankdf.columns)# show the features and label print bankdf.shape # instances vs features + label (4521, 17) |
输出

从输出中,我们看到数据集具有16个特征,并且标签用'y'指定。有关功能的详细说明,请参见此链接。
我们可以生成一个seaborncount图,以查看输出如何被其中一个类所支配。
import matplotlib.pyplot as plt import seaborn as sns sns.set(font_scale=1.5) countplt=sns.countplot(x='y', data=bankdf, palette ='hls') plt.show() |

银行数据的标签(y)以“ no”变量为主
我们可以用下面的代码片段来计算数字
count_no_sub = len(bankdf[bankdf['y']=='no']) print count_no_sub >>> 4000 |
由于数据集的标签以“是”和“否”给出,因此有必要将它们替换为数字(可能分别为1和0),以便将其用于数据建模。 第一步,我们将数据集的输出标签从yes / no二进制字符串转换为1/0整数。
bankdf['y'] = (bankdf['y']=='yes').astype(int) # changing yes to 1 and no to 0 print bankdf['y'].value_counts() >>> 0 4000 1 521 Name: y, dtype: int64 |
由于现在输出标签已转换为整数,因此我们可以使用pandas的groupby功能来进一步研究数据集。根据输出标签(是/否),我们可以看到功能部件中的数字如何变化。
out_label = bankdf.groupby('y') print out_label.agg(np.mean) # above two lines can be written using a single line of code #print bankdf.groupby('y').mean() >>> age balance day duration campaign pdays previous y 0 40.99 1403.2117 15.948 226.347 2.862 36.006 0.471 1 42.49 1571.9558 15.658 552.742 2.266 68.639 1.090 |
首先,在这里我们只看到16个特征中的7个,因为其余特征是对象,而不是整数或浮点数。 您可以输入bankdf.info()进行检查。 我们发现,“持续时间”功能可以告诉我们最近一次通话的持续时间(以秒为单位),对于购买产品的客户来说,是不购买的客户的两倍。 “广告系列”(表示当前广告系列中的致电次数)对于购买产品的客户而言较低。 groupby可以为我们提供有关要素和标签之间关系的重要信息。 有兴趣的人可以在“教育”功能上检查类似的“ groupby”操作,以验证受过高等教育的客户具有最高的“余额”(平均每年余额,以欧元计)!
数据集的某些功能具有许多类别,可以使用series对象的unique方法进行检查。例子如下
print bankdf["education"].unique() print bankdf["marital"].unique() >>> ['primary' 'secondary' 'tertiary' 'unknown'] ['married' 'single' 'divorced']
|
这些变量称为分类变量,就pandas而言,这些变量称为“对象”。 要使用分类变量检索信息,我们需要将其转换为“虚拟”变量,以便可以将其用于建模。 我们使用pandas.get_dummies功能来实现。 首先,我们创建分类变量列表
cat_list = ['job','marital','education','default','housing','loan','contact','month','poutcome'] |
然后我们将这些变量转换为伪变量,如下所示
for ele in cat_list: add = pd.get_dummies(bankdf[ele], prefix=ele) bankdf1 = bankdf.join(add)# join columns with old dataframe bankdf = bankdf1 #print bankdf.head(3) #print bankdf.info() |
我们为每个分类变量创建了虚拟变量,并打印出新数据框的头部,结果如下

您可以了解如何将分类变量转换为虚拟变量,这些虚拟变量已准备好在此数据集的建模中使用。 但是,我们这里有一个小问题。 实际的分类变量仍然存在,需要将其删除以使数据框架为机器学习做好准备。 为此,我们首先使用tolist()属性将新数据框的列标题转换为列表。 然后,我们创建一个没有分类变量的新列标题列表,并重命名标题。 我们使用以下代码执行此操作
bank_vars = bankdf.columns.values.tolist() # column headers are converted into a list to_keep = [i for i in bank_vars if i not in cat_list] #create a new list by comparing with the list of categorical variables - 'cat_list' print to_keep # check the list of headers to make sure no categorical variable remains |
我们已经准备好创建一个没有分类变量的新DataFrame,我们可以通过-
bank_final = bankdf[to_keep] |
请注意,要创建新的DataFrame,我们在此处将列表(to_keep)传递给索引运算符(bankdf)。 如果您没有通过索引运算符传递列名列表,它将返回keyerror。 要选择多个列作为DataFrame,我们应该将列表传递给索引运算符。 但是,您可以选择一个列作为“Series”,并且可以在下面看到
bank_final = bankdf[to_keep] # to_keep is a 'list' print type(bank_final) >>> <class 'pandas.core.frame.DataFrame'> bank_final = bankdf['age'] print type(bank_final) >>> <class 'pandas.core.series.Series'> bank_final = bankdf['age','y'] print type(bank_final) >>> KeyError: ('age', 'y') |
我们可以验证新的DataFrame的bank-final列的标题。
print bank_final.columns.values >>> ['age' 'balance' 'day' 'duration' 'campaign' 'pdays' 'previous' 'y' 'job_admin.' 'job_blue-collar' 'job_entrepreneur' 'job_housemaid' 'job_management' 'job_retired' 'job_self-employed' 'job_services' 'job_student' 'job_technician' 'job_unemployed' 'job_unknown' 'marital_divorced' 'marital_married' 'marital_single' 'education_primary' 'education_secondary' 'education_tertiary' 'education_unknown' 'default_no' 'default_yes' 'housing_no' 'housing_yes' 'loan_no' 'loan_yes' 'contact_cellular' 'contact_telephone' 'contact_unknown' 'month_apr' 'month_aug' 'month_dec' 'month_feb' 'month_jan' 'month_jul' 'month_jun' 'month_mar' 'month_may' 'month_nov' 'month_oct' 'month_sep' 'poutcome_failure' 'poutcome_other' 'poutcome_success' 'poutcome_unknown'] |
我们可以分离特征变量和标签,以便可以在数据集上测试某些机器学习算法。使用以下代码从此新DataFrame中选择功能和标签
bank_final_vars=bank_final.columns.values.tolist()# just like before converting the headers into a list Y = ['y'] X = [i for i in bank_final_vars if i not in Y] |
由于功能太多,我们可以通过sklearn下的递归功能消除(RFE)选择一些最重要的功能,这需要两个步骤。 在以后的文章中,我可能会讨论为什么无法通过Logistic回归进行功能选择,但是现在让我们使用RFE选择一些重要功能。 首先将分类器传递给RFE,其中包含要选择的多个特征,然后调用fit方法。 如下代码所示
model = LogisticRegression() rfe = RFE(model, 15) # we have selected here 15 features rfe = rfe.fit(bank_final[X], bank_final[Y]) |
我们可以使用support_属性来查找选择了哪些功能。
print rfe.support_ >>> [False False False False False False False False False False False False True False False False False False False False True False False False False False True False False False False True False False True False False True False True True True True False False True True True False True True] |
rfe.support_produces产生一个数组,其中选定的功能标记为True,您可以看到其中的15个,因为我们选择了最佳的15个功能。 RFE的另一个属性是ranking_,其中数组中的值1将突出显示所选要素。
print rfe.ranking_ >>> [33 37 32 35 23 36 31 18 11 29 27 30 1 28 17 7 12 10 5 9 1 21 16 25 22 4 1 26 24 13 20 1 14 15 1 34 6 1 19 1 1 1 1 3 2 1 1 1 8 1 1] |
我们可以使用以下代码明确打印出使用RFE选择的功能的名称
rfe_rankinglist = rfe.ranking_.tolist() selected_columns = [] for im in range(len(X)): if rfe_rankinglist[im]==1: selected_columns.append(X[im]) print selected_columns >>> ['job_retired', 'marital_married', 'default_no', 'loan_yes', 'contact_unknown', 'month_dec', 'month_jan', 'month_jul', 'month_jun', 'month_mar', 'month_oct', 'month_sep', 'poutcome_failure', 'poutcome_success', 'poutcome_unknown'] |
最后,我们可以继续使用.fit()和.score()属性来检查模型的性能。
以下是可用于检查功能选择效果的代码。 这里我们使用了整个数据集,但是最佳实践是将数据分为训练集和测试集。 作为一个小练习,您可以尝试执行此操作,并记住数据集的标签高度偏斜,并且使用分层可能是个好主意。
X_new = bank_final[selected_columns] Y = bank_final['y'] X_old = bank_final[X] clasf = LogisticRegression() clasf_sel = LogisticRegression() clasf.fit(X_old,Y) clasf_sel.fit(X_new,Y) print "score using all features", clasf.score(X_old,Y) print "score using selected features", clasf_sel.score(X_new,Y) |
因此,总结一下这篇文章,让我们总结最重要的观点
- 我们已经学会了使用pandasto处理现实数据集可能存在的一些问题。
- 我们已经学习了将字符串(“是”,“否”)转换为二进制变量(1、0)。
- Pandas DataFrame的groupby属性如何帮助我们理解要素和标签之间的一些关键联系。
- 将类别变量更改为虚拟变量,并在数据集建模中使用它们。
- 如何通过将列表传递给索引运算符来选择DataFrame的一部分。
- 使用RFE选择复杂数据集的一些主要功能。
阅读完整文档
Pandas