第1章 Numpy数值计算基础
1.1 创建数组对象
1.1.1 数组的属性
属性 说明 ndim 数组维度 shape 数组尺寸 size 数组元素总和 dtype 数组中元素的类型
1.1.2 数组创建
import numpy as np
np. array( [ [ 1 , 2 ] , [ 3 , 4 ] ] )
函数 说明与使用 arange np.arange(0,1,0.1) linspace 创建指定元素数量的数组 np.linspace(0,1,5) logspace 创建指定等比数列 np.logspace(0,2,20)
函数 用法 zeros np.zeros((2,3)) eye np.eye(3) diag np.diag([1,2,3,4]) ones np.ones((3,4))
1.2 生成随机数
import numpy as np
np. random. random( 100 )
函数 说明与使用 rand 均匀分布 np.random.rand(10,5) randn 正态分布 np.random.randn(2,3) randint 生成整数 np.random.randint(1,10,size=[2,6])
1.3 变换数组的形态
1.3.1 reshape
import numpy as np
arr = np. arange( 12 )
arr. reshape( 3 , 4 )
1.3.2 hstack 横向组合
import numpy as np
arr1 = np. arange( 12 ) . reshape( 3 , 4 )
arr2 = arr1 * 3
np. hstack( ( arr1, arr2) )
1.3.3 vstack 纵向组合
import numpy as np
arr1 = np. arange( 12 ) . reshape( 3 , 4 )
arr2 = arr1 * 3
np. vstack( ( arr1, arr2) )
1.4 创建矩阵
import numpy as np
np. matrix( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] )
注:np.all表示逻辑 and ;np.any表示逻辑or
1.5 读/写文件
np.savetext(“文件路径”,“数据”) 可加载csv文件 np.loadtext(“文件路径”)
1.6 排序与搜索
1.6.1 sort 直接排序
np. random. seed( 10 )
arr = np. random. randint( 1 , 10 , size= 7 )
arr. sort( )
print ( arr)
1.6.2 argsort 返回重新排序值的下标
np. random. seed( 10 )
arr = np. random. randint( 1 , 10 , size= 7 )
arr. argsort( )
1.6.3 lexsort 多个键值排序时按最后一个排序
a = np. array( [ 3 , 2 , 4 , 5 , 6 ] )
b = np. array( [ 12 , 53 , 83 , 12 , 57 ] )
c = np. array( [ 100 , 200 , 300 , 500 , 400 ] )
d = np. lexsort( ( a, b, c) )
list ( zip ( a[ d] , b[ d] , c[ d] ) )
1.6.4 where 返回满足给定条件的元素索引
import numpy as np
arr = np. arange( 12 ) . reshape( 3 , 4 )
np. where( arr> 5 )
1.7 去重与重复数据
unique 去重 tile(“数据”,“次数”) 对数组进行重复 repeat(“数据”,“次数”,“维度”) 对数组的元素进行重复
1.8 常用统计函数
函数 特殊解释 sum mean std var min max 使用axis参数指定维度 argmin argmax 返回对应值的索引 cumsum cumprod 累计和与累计积
第2章 Matplotlib数据可视化基础
2.1 掌握绘图基础语法和常用参数
import matplotlib. pyplot as plt
2.1.1 创建画布与创建子图
函数 解释 plt.figure() 创建空白画布 figure.add_subplot() 创建并选中子图
2.1.2 添加画布内容
函数 解释 plt.title() 添加标题 plt.xlabel() 添加x轴名称 plt.ylabel() 添加y轴名称 plt.xlim() 指定x轴的范围 plt.ylim() 指定y轴的范围 plt.xticks() 指定x轴刻度的数目与取值 plt.yticks() 指定y轴刻度的数目与取值 plt.legend() 指定当前图形的图例 plt.text(‘x’,‘y’,‘文本’) 添加文本
2.1.3 保存与显示图形
函数 解释 plt.savafig() 保存绘制的图形 plt.show() 显示图形
2.1.4 预设风格
import matplotlib. pyplot as plt
plt. style. available
2.1.5 rc参数
plt. rcParams[ 'lines.linestyle' ] = '-.'
函数 解释 plt.rcParams 查看rc默认参数 lines.linewidth 线条宽度 lines.linestyle 线条样式 lines.marker 线条上点的形状 lines.markersize 点的大小
2.1.6 显示中文标题
plt. rcParams[ 'font.sans-serif' ] = 'SimHei'
plt. rcParams[ 'axes.unicode_miuns' ] = False
2.2 分析特征间关系
2.2.1 散点图:了解特征间的相关关系
plt. scatter( 'x' , 'y' , s= '点的大小' , c= '点的颜色' ,
marker= '点的类型' , alpha= '点的透明度' )
2.2.2 折线图:了解特征间的趋势关系(一次接收多组数据)
plt. plot( 'x' , 'y' , color= '点的颜色' , linestyle= '线条类型' ,
marker= '点的类型' , alpha= '点的透明度' )
2.2.3 直方图:数据的频数情况(定量数据)
plt. hist( '数据' , bins= '长方形数' , range = '数据范围' ,
normed= '频率/频数' , rwidth= '长方形宽度' )
2.2.4 条形图:数据的数量情况(分类数据)
plt. bar( left= 'x轴数据' , height= 'x轴数据的数量' ,
width= '直方图宽度' , color= '直方图颜色' )
2.2.5 饼图:数据的占比情况
plt. pie( '数据' )
函数 说明 explode 指定项距离饼图圆心为n个半径 labels 每一项的名称 color 饼图的颜色 autopct 数值的显示方式 pctdistance 指定每一项的autopct和距离圆心的半径 labeldistance 指定每一项名称label和距离圆心的半径0 radius 饼图的半径
2.2.6 箱线图:数据的分散情况
plt. boxplot( '数据' )
函数 用法 notch 箱体中间是否有缺口 sym 异常点的形状 vert 图形是横向还是纵向 positions 图形位置 widths 每个箱体的宽度 labels 每个箱体的标签 meanline 是否显示均值线
第4章 使用scikit-learn构建模型
4.1 使用sklearn转换器处理数据
4.1.1 加载datasets模块中的数据集
from sklearn. datasets import load_breast_cancer
cancer = load_breast_cancer( )
cancer_data = cancer. data
cancer_target = cancer. target
cancer_names = cancer. feature_names
print ( '原始数据集数据的形状为:' , cancer_data. shape)
print ( '原始数据集标签的形状为:' , cancer_target. shape)
4.1.2 将数据集划分为训练集和测试集
from sklearn. model_selection import train_test_split
cancer_data_train, cancer_data_test, cancer_target_train, \
cancer_target_test = train_test_split( cancer_data,
cancer_target, test_size= 0.2 , random_state= 42 )
print ( '训练集数据的形状为:' , cancer_data_train. shape)
print ( '测试集数据的形状为:' , cancer_data_test. shape)
print ( '训练集标签的形状为:' , cancer_target_train. shape)
print ( '测试集标签的形状为:' , cancer_target_test. shape)
4.1.3 数据预处理
import numpy as np
from sklearn. preprocessing import MinMaxScaler
Scaler = MinMaxScaler( ) . fit( cancer_data_train)
cancer_trainScaler = Scaler. transform( cancer_data_train)
print ( '离差标准化前训练集数据的最小值为:' , np. min ( cancer_data_train) )
print ( '离差标准化前训练集数据的最大值为:' , np. max ( cancer_data_train) )
print ( '离差标准化后训练集数据的最小值为:' , np. min ( cancer_trainScaler) )
print ( '离差标准化后训练集数据的最大值为:' , np. max ( cancer_trainScaler) )
cancer_testScaler = Scaler. transform( cancer_data_test)
print ( '离差标准化前测试集数据的最小值为:' , np. min ( cancer_data_test) )
print ( '离差标准化前测试集数据的最大值为:' , np. max ( cancer_data_test) )
print ( '离差标准化后测试集数据的最小值为:' , np. min ( cancer_testScaler) )
print ( '离差标准化后测试集数据的最大值为:' , np. max ( cancer_testScaler) )
函数名称 说明 StandardScaler 标准差标准化 Normalizer 归一化 Binarizer 对定量特征进行二值化处理 OneHotEncoder 对定性特征进行独热编码处理
4.1.4 降维PCA
from sklearn. decomposition import PCA
pca_model = PCA( n_components= 10 ) . fit( cancer_trainScaler)
cancer_trainPca = pca_model. transform( cancer_trainScaler)
print ( 'PCA降维前训练集数据的形状为:' , cancer_trainScaler. shape)
print ( 'PCA降维后训练集数据的形状为:' , cancer_trainPca. shape)
cancer_testPca = pca_model. transform( cancer_testScaler)
print ( 'PCA降维前测试集数据的形状为:' , cancer_testScaler. shape)
print ( 'PCA降维后测试集数据的形状为:' , cancer_testPca. shape)
4.2 构建并评价聚类模型
4.2.1 使用sklearn估计器构建聚类模型
from sklearn. datasets import load_iris
from sklearn. preprocessing import MinMaxScaler
from sklearn. cluster import KMeans
iris = load_iris( )
iris_data = iris[ 'data' ]
iris_target = iris[ 'target' ]
iris_names = iris[ 'feature_names' ]
scale = MinMaxScaler( ) . fit( iris_data)
iris_dataScale = scale. transform( iris_data)
kmeans = KMeans( n_clusters= 3 , random_state= 123 ) . fit( iris_dataScale)
print ( '构建的K-Means模型为:\n' , kmeans)
result = kmeans. predict( [ [ 1.5 , 1.5 , 1.5 , 1.5 ] ] )
print ( '花瓣花萼长度宽度全为1.5的鸢尾花预测类别为:' , result[ 0 ] )
4.2.2 聚类结果可视化
import pandas as pd
from sklearn. decomposition import PCA
import matplotlib. pyplot as plt
df = PCA( n_components= 2 ) . fit_transform( iris_data)
df = pd. DataFrame( df)
df[ 'labels' ] = kmeans. labels_
df1 = df[ df[ 'labels' ] == 0 ]
df2 = df[ df[ 'labels' ] == 1 ]
df3 = df[ df[ 'labels' ] == 2 ]
fig = plt. figure( figsize= ( 9 , 6 ) )
plt. plot( df1[ 0 ] , df1[ 1 ] , 'bo' , df2[ 0 ] , df2[ 1 ] , 'r*' , df3[ 0 ] , df3[ 1 ] , 'gD' )
plt. show( )
4.2.3 评价聚类模型
方法名称 真实值 最佳值 sklearn函数 ARI评价法(兰德系数) 需要 1.0 adjusted_rand_score AMI评价法(互信息) 需要 1,0 adjusted_mutual_info_score V-measure评分 需要 1.0 completeness_score FMI评价法 需要 1.0 fowlkes_mallows_score 轮廓系数评价法 不需要 畸变程度最大 silhouette_score Calinski-Harabasz指数评价法 不需要 相较最大 calinski_harabaz_score
4.2.3.1 使用FMI评价法评价K-means聚类模型
from sklearn. metrics import fowlkes_mallows_score
for i in range ( 2 , 7 ) :
kmeans = KMeans( n_clusters= i, random_state= 123 ) . fit( iris_data)
score = fowlkes_mallows_score( iris_target, kmeans. labels_)
print ( 'iris数据聚%d类FMI评价分值为:%f' % ( i, score) )
4.2.3.2 使用轮廓系数法评价K-means聚类模型
from sklearn. metrics import silhouette_score
import matplotlib. pyplot as plt
silhouettteScore = [ ]
for i in range ( 2 , 15 ) :
kmeans = KMeans( n_clusters= i, random_state= 123 ) . fit( iris_data)
score = silhouette_score( iris_data, kmeans. labels_)
silhouettteScore. append( score)
plt. figure( figsize= ( 10 , 6 ) )
plt. plot( range ( 2 , 15 ) , silhouettteScore, linewidth= 1.5 , linestyle= "-" )
plt. show( )
4.2.3.3 使用calinski_harabasz指数评价K-means聚类模型
from sklearn. metrics import calinski_harabasz_score
for i in range ( 2 , 7 ) :
kmeans = KMeans( n_clusters= i, random_state= 123 ) . fit( iris_data)
score = calinski_harabasz_score( iris_data, kmeans. labels_)
print ( 'iris数据聚%d类calinski_harabasz指数为:%f' % ( i, score) )
4.3 构建并评价分类模型
模块名称 函数名称 算法名称 linear_model LogisticRegression 逻辑斯蒂回归 svm SVC 支持向量机 neighbors KNeighborsClassifier K最近邻分类 naive_bayes GaussianNB 高斯朴素贝叶斯 tree DesisionTreeClassifier 分类决策树 ensemble RandomForestClassifier 随机森林分类 ensemble GranientBoostingClassifier 梯度提升分类树
4.3.1 使用sklearn估计器构建分类模型
import numpy as np
from sklearn. datasets import load_breast_cancer
from sklearn. svm import SVC
from sklearn. model_selection import train_test_split
from sklearn. preprocessing import StandardScaler
cancer = load_breast_cancer( )
cancer_data = cancer[ 'data' ]
cancer_target = cancer[ 'target' ]
cancer_names = cancer[ 'feature_names' ]
cancer_data_train, cancer_data_test, cancer_target_train, \
cancer_target_test = train_test_split( cancer_data,
cancer_target, test_size = 0.2 , random_state = 22 )
stdScaler = StandardScaler( ) . fit( cancer_data_train)
cancer_trainStd = stdScaler. transform( cancer_data_train)
cancer_testStd = stdScaler. transform( cancer_data_test)
svm = SVC( ) . fit( cancer_trainStd, cancer_target_train)
print ( '建立的SVM模型为:\n' , svm)
cancer_target_pred = svm. predict( cancer_testStd)
print ( '预测前20个结果为:\n' , cancer_target_pred[ : 20 ] )
true = np. sum ( cancer_target_pred == cancer_target_test)
print ( '预测对的结果数目为:' , true)
print ( '预测错的的结果数目为:' , cancer_target_test. shape[ 0 ] - true)
print ( '预测结果准确率为:' , true/ cancer_target_test. shape[ 0 ] )
4.3.2 评价分类模型
方法名称 最佳值 sklearn函数 Precision(精确率) 1,0 metrics.precision_score Recall(召回率) 1.0 metrics.recall_score F1值 1.0 metrics.f1_score Cohen’s Kappa系数 1.0 metrics.cohen_kappa_score ROC曲线 靠近y轴 metrics.roc_curve
4.3.2.1 分类模型常用评价方法
from sklearn. metrics import accuracy_score, precision_score, \
recall_score, f1_score, cohen_kappa_score
print ( '使用SVM预测breast_cancer数据的准确率为:' ,
accuracy_score( cancer_target_test, cancer_target_pred) )
print ( '使用SVM预测breast_cancer数据的精确率为:' ,
precision_score( cancer_target_test, cancer_target_pred) )
print ( '使用SVM预测breast_cancer数据的召回率为:' ,
recall_score( cancer_target_test, cancer_target_pred) )
print ( '使用SVM预测breast_cancer数据的F1值为:' ,
f1_score( cancer_target_test, cancer_target_pred) )
print ( '使用SVM预测breast_cancer数据的Cohen’s Kappa系数为:' ,
cohen_kappa_score( cancer_target_test, cancer_target_pred) )
4.3.2.2 分类模型评价报告
from sklearn. metrics import classification_report
print ( '使用SVM预测iris数据的分类报告为:' , '\n' ,
classification_report( cancer_target_test, cancer_target_pred) )
4.3.2.3 绘制ROC曲线
from sklearn. metrics import roc_curve
import matplotlib. pyplot as plt
fpr, tpr, thresholds = roc_curve( cancer_target_test, cancer_target_pred)
plt. figure( figsize= ( 10 , 6 ) )
plt. xlim( 0 , 1 )
plt. ylim( 0.0 , 1.1 )
plt. xlabel( 'False Postive Rate' )
plt. ylabel( 'True Postive Rate' )
plt. plot( fpr, tpr, linewidth= 2 , linestyle= "-" , color= 'red' )
plt. show( )
4.4 构建并评价回归模型
4.4.1 使用sklearn估计器构建线性回归模型
from sklearn. linear_model import LinearRegression
from sklearn. datasets import load_boston
from sklearn. model_selection import train_test_split
boston = load_boston( )
X = boston[ 'data' ]
y = boston[ 'target' ]
names = boston[ 'feature_names' ]
X_train, X_test, y_train, y_test= train_test_split( X, y, test_size = 0.2 , random_state= 125 )
clf = LinearRegression( ) . fit( X_train, y_train)
print ( '建立的LinearRegression模型为:' , '\n' , clf)
y_pred = clf. predict( X_test)
print ( '预测前20个结果为:' , '\n' , y_pred[ : 20 ] )
4.4.2 回归结果可视化
import matplotlib. pyplot as plt
from matplotlib import rcParams
rcParams[ 'font.sans-serif' ] = 'SimHei'
fig = plt. figure( figsize= ( 10 , 6 ) )
plt. plot( range ( y_test. shape[ 0 ] ) , y_test, color= "blue" , linewidth= 1.5 , linestyle= "-" )
plt. plot( range ( y_test. shape[ 0 ] ) , y_pred, color= "red" , linewidth= 1.5 , linestyle= "-." )
plt. legend( [ '真实值' , '预测值' ] )
plt. show( )
4.4.3 评价回归模型
方法名称 sklearn函数 平均绝对标准误 metrice.mean_absolute_erro 均方误差 metrice.mean_squared_error 中值绝对误差 metrice.median_absolute_error 可解释方差值 metrice.explained_variance_score R平方值 metrice.r2_score
from sklearn. metrics import explained_variance_score, \
mean_absolute_error, mean_squared_error, \
median_absolute_error, r2_score
print ( 'Boston数据线性回归模型的平均绝对误差为:' , mean_absolute_error( y_test, y_pred) )
print ( 'Boston数据线性回归模型的均方误差为:' , mean_squared_error( y_test, y_pred) )
print ( 'Boston数据线性回归模型的中值绝对误差为:' , median_absolute_error( y_test, y_pred) )
print ( 'Boston数据线性回归模型的可解释方差值为:' , explained_variance_score( y_test, y_pred) )
print ( 'Boston数据线性回归模型的R方值为:' , r2_score( y_test, y_pred) )
第5章 航空公司客户价值分析
5.1 了解航空公司现状与客户价值分析
抽取航空公司2012年4月1日至2014年3月31日的数据 对抽取的数据进行数据清洗、特征构建和标准化等操作 基于RFM模型,使用K-Means算法进行客户分群
5.2 缺失值与异常值处理
import numpy as np
import pandas as pd
airline_data = pd. read_csv( "./data/air_data.csv" , encoding= "gb18030" )
print ( '原始数据的形状为:' , airline_data. shape)
exp1 = airline_data[ "SUM_YR_1" ] . notnull( )
exp2 = airline_data[ "SUM_YR_2" ] . notnull( )
exp = exp1 & exp2
airline_notnull = airline_data. loc[ exp, : ]
print ( '删除缺失记录后数据的形状为:' , airline_notnull. shape)
index1 = airline_notnull[ 'SUM_YR_1' ] != 0
index2 = airline_notnull[ 'SUM_YR_2' ] != 0
index3 = ( airline_notnull[ 'SEG_KM_SUM' ] > 0 ) & \
( airline_notnull[ 'avg_discount' ] != 0 )
airline = airline_notnull[ ( index1 | index2) & index3]
print ( '删除异常记录后数据的形状为:' , airline. shape)
5.3 选取并构建LRFMC模型的5个特征
airline_selection = airline[ [ "FFP_DATE" , "LOAD_TIME" ,
"FLIGHT_COUNT" , "LAST_TO_END" , "avg_discount" , "SEG_KM_SUM" ] ]
L = pd. to_datetime( airline_selection[ "LOAD_TIME" ] ) - \
pd. to_datetime( airline_selection[ "FFP_DATE" ] )
L = L. astype( "str" ) . str . split( ) . str [ 0 ]
L = L. astype( "int" ) / 30
airline_features = pd. concat( [ L, airline_selection. iloc[ : , 2 : ] ] , axis= 1 )
print ( '构建的LRFMC特征前5行为:\n' , airline_features. head( ) )
from sklearn. preprocessing import StandardScaler
data = StandardScaler( ) . fit_transform( airline_features)
print ( '标准化后LRFMC五个特征为:\n' , data[ : 5 , : ] )
5.4 使用K-Means算法进行客户分群
常用参数 说明 n_clusters 分类簇的数量 max_iter 最大迭代次数 n_init 算法运行次数 init 初始点的选取
属性 说明 cluster_centers_ 分类簇的均值向量 labels_ 每个样本所属簇的标记 Inertia_ 每个样本距离他们各自最近簇中心之和
import numpy as np
import pandas as pd
from sklearn. cluster import KMeans
airline_scale = np. load( './tmp/airline_scale.npz' ) [ 'arr_0' ]
k = 5
kmeans_model = KMeans( n_clusters = k, random_state= 123 )
fit_kmeans = kmeans_model. fit( airline_scale)
print ( kmeans_model. cluster_centers_)
print ( kmeans_model. labels_)
r1 = pd. Series( kmeans_model. labels_) . value_counts( )
print ( '最终每个类别的数目为:\n' , r1)
第6章 财政收入预测分析
6.1 了解财政收入预测的背景和方法
分析、识别影响地方财政收入的关键特征 预测2014年和2015年的财政收入
6.2 分析财政收入数据特征的相关性
import numpy as np
import pandas as pd
inputfile = './data/data.csv'
data = pd. read_csv( inputfile)
print ( '相关系数矩阵为:' , np. round ( data. corr( method= 'pearson' ) , 2 ) )
6.3 使用Lasso回归选取财政收入预测的关键特征
import numpy as np
import pandas as pd
from sklearn. linear_model import Lasso
inputfile = './data/data.csv'
data = pd. read_csv( inputfile)
lasso = Lasso( 1000 , random_state= 1234 )
lasso. fit( data. iloc[ : , 0 : 13 ] , data[ 'y' ] )
print ( '相关系数为:' , np. round ( lasso. coef_, 5 ) )
6.4 计算相关系数非零的个数
print ( '相关系数非零个数为:' , np. sum ( lasso. coef_ != 0 ) )
mask = lasso. coef_ != 0
print ( '相关系数是否为零:' , mask)
new_reg_data = data. iloc[ : , : 13 ] . iloc[ : , mask]
print ( '输出数据的维度为:' , new_reg_data. shape)
6.5 使用SVR构建财政收入预测模型
参数名称 说明 epsilon 用于loss参数中的参数 tol 终止迭代的阈值 C 罚项系数 loss 损失函数 fit_intercept 是否计算模型的截距 max_iter 最大迭代次数
属性名称 说明 coef_ 给出各个特征的权重 intercept_ 决策函数中的常数项
import pandas as pd
import numpy as np
from sklearn. svm import LinearSVR
import matplotlib. pyplot as plt
from sklearn. metrics import explained_variance_score, \
mean_absolute_error, mean_squared_error, \
median_absolute_error, r2_score
inputfile = './tmp/new_reg_data_GM11.csv'
data = pd. read_csv( inputfile)
feature = [ 'x1' , 'x3' , 'x4' , 'x5' , 'x6' , 'x7' , 'x8' , 'x13' ]
data_train = data. iloc[ : 20 , : ] . copy( )
data_mean = data_train. mean( )
data_std = data_train. std( )
data_train = ( data_train - data_mean) / data_std
x_train = data_train[ feature] . values
y_train = data_train[ 'y' ] . values
linearsvr = LinearSVR( )
linearsvr. fit( x_train, y_train)
x = ( ( data[ feature] - data_mean[ feature] ) / data_std[ feature] ) . values
data[ u'y_pred' ] = linearsvr. predict( x) * data_std[ 'y' ] + data_mean[ 'y' ]
print ( '真实值与预测值分别为:' , data[ [ 'y' , 'y_pred' ] ] )
print ( '预测图为:' , data[ [ 'y' , 'y_pred' ] ] . plot( subplots= True , style= [ 'b-o' , 'r-*' ] ) )
plt. show( )