基于python代码的数据科学导引学习笔记(一)

目录

  • 1.说明
  • 2.数据预处理
    • 2.1.数据初步诊断与探索
      • (1)读取数据
      • (2)正态检验
    • 2.2.缺失值处理和离群值检测
      • (1)缺失值处理
      • (2)均值填充
    • 2.3.常用的数据转换方法
      • (1)Min-Max标准化
      • (2)等频离散化
      • (3)z-score标准化
  • 3.回归模型
    • 3.1.简单线性回归
    • 3.2线性回归正则化
  • 4.分类模型
    • 4.4决策树
      • (1)
      • (2)
    • 4.5朴素贝叶斯
  • 5.集成模型
    • 5.1集成方法概述
  • 6.聚类模型
    • 6.1聚类方法概述
    • 6.2.K-means聚类
      • (1)
      • (2)

1.说明

  1. 该学习笔记仅供个人学习使用,不代表任何官方指导或意见。
  2. 如侵权,请练习删除。
  3. 有需要其他资料或有其他问题可私信或者加qq2356081476,这不是我的义务但也欢迎各位朋友与我讨论相关问题,共同进步。
  4. 错字,语法,排版等问题请见谅。

2.数据预处理

2.1.数据初步诊断与探索

(1)读取数据

  • 用pandas库读取csv文件challenge.csv
  • 提取该数据集的字段名称,存为cols
  • 提取该数据集的字段和样本数量,分别存为col_num,sam_num
  • 获取数据集的前五行,将最后的DataFrame存为five_data
import pandas as pd

data = pd.read_csv("chanllenge.csv")	#读取文件
cols = list(data.columns)		#获取字段名称(列名)
col_num = len(cols)			#获取字段数量(列数)
sam_num = data.shape[0]			#获取样本数量
five_data = data.head()			#获取样本前五行

讲一下sam_num = data.shape[0]five_data = data.head()这两句:

  • DataFrame.shape返回DataFrame对象(此例中的data)的形状的一个元组,比如说(2,3)就表示DataFrame对象有2行3列。这里再加一个[0]表示索引第一个的值,就是行的值,也就是我们需要的“样本数量”了。
  • DataFrame.head()函数,这里面其实有一个参数n,默认等于5就不写了,获取样本前五行。如果five_data = data.head(n = 10)就是获取样本前十行。

(2)正态检验

  • 使用numpy库生成服从均匀分布的一维数据集,样本容量100
  • 使用scipy库中的stats模块,对生成的数据进行正态检验,将检验的结果存为model
  • 提示:可以使用kstest()函数实现此功能。
import numpy as np
from scipy.stats import stats

test_data = np.random.random(size = 100)
model = stats.kstest(test_data,'norm')		#正太检验

讲一下scipy库、kstest()函数和np.random模块:

  • scipy库,是一个高级科学计算库,基于numpy,增加的功能包括数值积分、最优化、统计和一些专用函数。
  • kstest就是scipyku下stats模块(统计相关模块)的一个函数,用来检测样本是否服从某种分布。如model = stats.kstest(test_data,'norm')中kstest这里有两个参数,一个就是我们的数据(样本),另外一个是我们要看数据是否符合的分布。norm表示标准正态分布,还有其他不作介绍了。kstest还有其他参数也不多做介绍。
  • numpy库random模块下的random()函数,生成一个ndarray对象,类似于列表或者说矩阵,参数size=100返回一个ndarray数组,长度为100,若以列表的形式给出参数size如size = [100,20]则返回的ndarray的形状(shape)属性就是(100,20)表示有100行,20列

2.2.缺失值处理和离群值检测

(1)缺失值处理

  • 已使用pandas生成series对象example_data
  • 使用isnull()函数确定example_data是否含有缺失值,将结果存为boolean_array
  • 使用fillna()函数使用字符串missing替换缺失值,将替换后的series对象存为呢哇_data
import pandas as pd

example_data = pd.Series([1,2,3,np.nan,4])
boolean_array = pd.isnull(example_data)
new_data = example_data.fillna('missing')

(2)均值填充

  • 已给出DataFrame对象data
  • 用缺失值均值填充的方法填充data中的缺失数据,结果存为new_data
new_data = data.fillna(data.mean())

2.3.常用的数据转换方法

(1)Min-Max标准化

  • 现已使用numpy读取数据集birthrate.csv
  • 获取该数据集第二列birth_rates的最大值和最小值
  • 根据Min-Max标准化的数学公式,将特征birth_rates映射到区间[0,1]之中,并将结果存为minmax_scaling_data

Min-Max标准化的数学公式:
f i ′ = f i − f m i n f m a x − f m i n f'_i=\frac{f_i - f_{min}}{f_{max}-f_{min}} fi=fmaxfminfifmin
其中 f i f_i fi为原数据, f i ′ f'_i fi为标准化后的数据,另外两个分别是数据的最大值和最小值。

import pandas as pd 

data = pd.readd_csv('birthrate.csv')
dmax = max(data.birth_rates)					#最大值
dmin = min(data.birth_rates)					#最小值
minmax_scaling_data = (data.birth_rates - dmin)/(dmax-dmin)	#Min-Max标准化

(2)等频离散化

  • 对上述数据集的birth_rates特征使用四分位数作为切分点,通过qcut()函数完成等频离散化,将结果存为data_qcut
import pandas as pd

data = pd.readd_csv('birthrate.csv')
data_qcut = pd.qcut(data['birth_rates'], 4)	#等频离散化

讲一下等频离散化和qcut()函数:

  • 等频离散化,将特征分成k个区间,每个区间里面的样本数量是一样的(这样的话区间长度不一致)。另外的等距离散化就是将特征分成k个区间,每个区间长度一样。等频离散化的好处呢,和其他所有离散化一样,什么基于模型需要啊,什么更加容易理解啊更加稳定啊balabala,缺点就是容易使相同的特征值分到不同的区间去。
  • qcut()函数,注意题目说的四分位数作为切分点,这和把数据分成四等分是一样的。两个参数,一个参数是我们要等频离散化的数据(样本),另外一个k就是k等分

(3)z-score标准化

  • 已给出数据集data,可以直接使用。
  • data的列名组成的列表为['ID','CT','FA','WT','SP'],对其不是ID列的列进行z-score标准化

Min-Max标准化的数学公式:
f i ′ = f i − μ σ f'_i = \frac{fi - \mu}{\sigma} fi=σfiμ
其中 μ \mu μ σ \sigma σ分别为 f f f的均值和标准差

import pandas as pd

new_columns = ['CT','FA','WT','SP']
data[new_columns] = data[new_columns].apply(lambda x : ((x - x.mean())/x.srd())		#z-score标准化

下面对apply()进行一些说明:

  • 这里关于pandas下的apply()函数和lambda匿名函数的介绍很不错。
  • 稍微说一下apply()函数的参数,第一个参数就是一个匿名函数,当然也可以是已知的函数或者其他定义的函数。
  • axis参数为0对DataFrame对象按进行遍历,并对每个样本进行lambda定义的操作,axis参数为1则按进行遍历再操作。不输入axis默认是0(按列)。当然如果你的DataFrame对象维数更高,axis也就有2,3,4以及更高的参数可以传入。还有其他的参数先不作介绍了。

3.回归模型

3.1.简单线性回归

  • 为方便使用,我们对数据集进行了适当的预处理,包括删除表示日期的dteday特征变量和表示样本编号的instant特征变量。特别地,数据集里包含了非会员租借数量与会员租借数量这两个与总租借数量具有强相关关系的特征变量,为了防止这两个特征变量对模型的干扰,我们将这两个特征变量也删除掉。
  • 预处理后的数据集包括11个与自行车总租借数相关的特征变量,共731个样本点。目标变量是所有的自行车租借数量(包括非注册会员和注册会员)cnt
  • 随机抽取数据集70%的数据作为训练集df_trainxdf_trainy,剩下的30%的数据进行回归结果测试df_testx
  • 要求基于测试集,根据选择的模型给出预测结果predict_value
from sklearn .linear_model import LinearRegression

model = LinearRegression().fit(df_trainx,df_trainy)	#训练模型
predict_value = model.predict(df_testx)			#用训练出来的模型进行预测

3.2线性回归正则化

  • 为方便使用进行了适当的预处理。数据集一共包含12个自变量,目标变量为火灾面积(area),共517个样本点。
  • 需要注意的是,部分自变量之间是存在相关性的,预测时应如何选择或整合自变量信息,是值得思考的;另外,存在相当一部分火灾面积为0的数据,如何对目标变量进行相应变换使得模型预测结果更好,同样值得思考。
  • 测试模型时,将抽取70%的数据作为训练集df_trainxdf_trainy,用剩余样本进行回归结果测试df_testx
  • 要求基于测试集,根据选择的模型给出预测结果predict_value
from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(df_trainx, df_trainy)	#训练模型
predict_value = model.predict(df_testx)			#用训练出来的模型进行预测

一些说明:原章节这里的线性规划并不需要到正则化所以这里的代码并没有正则化。

4.分类模型

4.4决策树

(1)

  • 本题目基于UCI的 光学字符识别数据集,该数据集包含了26个英文大写字母的20000个样本。 每一个样本代表光学图像中的一个矩形区域,该区域只包含单一字符。 每一个样本包含16个自变量和letter目标变量,letter指示当前样本是哪一个字母,是我们的目标变量。
  • 要求基于测试集,使用决策树模型,给出预测结果predict_value
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier().fit(df_trainx,df_trainy)	#训练模型
predict_value = model.predict(df_testx)				#用训练出来的模型进行预测

(2)

  • 要求根据玻璃中的氧化物(例如,纳、镁等)含量对玻璃类型进行识别。数据集一共包含9个特征变量,1个类别变量(type,即玻璃的类型),共214个样本点。
  • 测试模型时,将从各类别中分别抽取70%的数据作为训练集df_trainxdf_trainy,用剩余样本进行分类结果测试df_testx
  • 要求基于测试集,使用决策树模型,给出预测结果predict_value
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier().fit(df_trainx,df_trainy) 	#训练模型
predict_value = model.predict(df_testx)    			#用训练出来的模型进行预测

4.5朴素贝叶斯

  • 给定如下信息
  • 队0获胜的概率prob_win_0 = 0.65
  • 队1获胜时队1是主场的概率prob_win_1_home_1 = 0.75
  • 队0获胜时队1是主场的概率prob_win_0_home_1 = 0.3
  • 请计算队1在客场取胜的概率p(Y=1|X=0),即prob_home_0_win_1,小数点保留三位。
## 计算队1获胜的概率prob_win_1
prob_win_1 = 1 - prob_win_0

## 计算队1取胜时队0是东道主的概率
prob_win_1_home_0 = 1 - prob_win_1_home_1

## 计算队0取胜时队0是东道主的概率
prob_win_0_home_0 = 1 - prob_win_0_home_1

## 计算队0是东道主的概率
prob_home_0 = prob_win_1_home_0*prob_win_1 + prob_win_0_home_0*prob_win_0

## 队1在客场取胜的概率
prob_home_0_win_1 = prob_win_0_home_1*(1-prob_home_0)/prob_win_0

5.集成模型

5.1集成方法概述

  • 数据集一共包含34个特征变量,1个类别变量(即诊断结果为健康/患病)。共有324个样本点,其中包括228个健康的和96个患病的。
  • 测试模型时,将从各类别中分别抽取70%的数据作为训练集df_trainxdf_trainy,用剩余样本进行分类结果测试df_testx
  • 要求基于测试集,根据选择的模型给出预测结果predict_value以及预测标签为1的概率predict_prob
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier().fit(df_trainx, df_trainy)	#训练模型
predict_value = model.predict(df_testx)				#用训练出来的模型进行预测
predict_prob = model.predict_proba(df_testx)[:, 1]

6.聚类模型

6.1聚类方法概述

  • 市场细分(market segmentation)是指营销者通过市场调研,依据消费者的需要和欲望、购买行为和购买习惯等方面的差异,把某一产品的市场整体划分为若干消费者群的市场分类过程。每一个细分市场都是具有类似需求倾向的消费者构成的群体
  • 细分市场都是具有类似需求倾向的消费者,而聚类算法很适合用来完成这一任务的。本题目中,我们将使用一份从社交网络平台抽取的描述青少年基本信息和兴趣爱好的数据集,利用聚类算法来进行青少年市场细分。
  • 使用一份包含30000个样本的美国高中生社交网络信息数据集。每个样本包含40个变量。
  • 本数据中部分字段为字符串,部分字段可能存在缺失值,在进行聚类分析之前,需要对数据进行恰当的预处理。
from sklearn.cluster import KMeans

a = df_trainx[df_trainx.isnull().values==True].drop_duplicates()	#将空值单独取出来放在一个新的DataFrame对象a里面
print(a.shape[0])							#输出a的形状的行(原df_trainx多少行有空值)
df_trainx = df_trainx.fillna(df_trainx.mean())				#均值填充缺失值
model = KMeans(n_clusters=3).fit(df_trainx)				#训练模型
predict_value = model.labels_						#输出模型结果

讲一下.drop_duplicates()这个后缀:
如果没有这个后缀,像这样df_trainx[df_trainx.isnull().values==True]那么如果某一行有多个空值,a则会有多个记录,加了后缀相当于一个去重的效果。

6.2.K-means聚类

(1)

  • 根据每种汽车的各个参数,利用聚类算法来快速进行聚类,使得性能相似的汽车能够快速识别出。本题目基于ISLR R package的Auto数据, 共392个样本,每个样本有8个变量。
  • 使用的数据变量名df_trainx,根据选择的模型给出预测结果predict_value
from sklearn.cluster import KMeans

model = KMeans(n_clusters=3).fit(df_trainx)	#训练模型
predict_value = model.labels_			#输出模型结果

(2)

  • 本题要求根据连衣裙的特征利用PCA降维后,对不同品牌型号的连衣裙进行分类,来判断是否向用户推荐该产品。
  • 数据集中每个样本包含11个特征变量和1个目标变量(即是否推荐)。目标变量并不用于聚类分析,但可用于聚类结果的评估。
  • 本题使用的数据变量名df_trainx根据选择的模型给出预测结果predict_value
  • 数据示例如下基于python代码的数据科学导引学习笔记(一)_第1张图片
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import PCA
import jieba


# 分词及对文本向量化表示
list_text = [' '.join(word for word in jieba.cut(line) if word != ' ') for line in df_trainx.ix[:, 0]]
tfidf = TfidfVectorizer(max_df=0.95, stop_words=stopwords).fit(list_text)
array_trainx = tfidf.transform(list_text).toarray()


# PCA降维
pca = PCA()
pca.fit(array_trainx)
n_component = 0
while sum(pca.explained_variance_ratio_[0: n_component]) < 0.9:
    n_component += 1
pca = PCA(n_components=n_component)
array_trainx = pca.fit_transform(array_trainx)


# 训练模型
model = KMeans(n_clusters=2).fit(array_trainx)
# 输出预测结果
predict_value = model.labels_

第一次看到这串代码肯定一脸懵逼,下面对代码说明:

  1. list_text = [' '.join(word for word in jieba.cut(line) if word != ' ') for line in df_trainx.ix[:, 0]]

这个嵌套应用了列表表达式,比较高级。

先看最后的for line in df_trainx.ix[:, 0]],表示对于df_trainx中第一列的每个元素暂时符给line,然后line在前面list_text = [' '.join(word for word in jieba.cut(line) if word != ' ')这一段里面操作。
然后看这个word for word in jieba.cut(line),表示对line进行分词后的每个元素复制给word,然后对word进行操作。

这里又要插一下关于jieba.cut()的说明了。jieba是一个对文本进行拆分(分词)的模块,这个模块支持中文文本。cut是里面的函数。cut()有两个传入参数,第一个就是要拆分的字符串,就是这里的line,第二个参数是拆分的不同模式,不具体介绍。

if word != ' '限制了line中的空字符不要赋值给word。然后把每个word加入到(join()函数)最前面那个空字符里面去。说白了就是line不要’'空字符。

总体就是df_trainx.ix[:, 0]]这一列的元素不要空字符形成一个名字叫list_text的列表对象。

  1. tfidf = TfidfVectorizer(max_df=0.95, stop_words=stopwords).fit(list_text)

首先看TfidfVectorizer是from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import PCA这句代码从sklearn库里面导入进来的。(我的理解,我也没有太研究深入)简单解释其实它是一个模型的模板,统计list_text列表中每个元素(词)的频率,然后构建出了具体的模型名字叫tfidf

3.array_trainx = tfidf.transform(list_text).toarray()
这个相当于把tfidf模型的一个numpy数组(ndarray对象)赋值给array_trainx,大概就是toarray()的意思吧。然后这个数组表示的是什么呢?(任然是我根据输出大致看出来的,没有深入研究,希望有大佬能指正),数组的元素是1和0,每一行是一个样本。然后列表示原来特征的值,行的样本的特征值本来是哪个,它就在哪个列1,其他列全0。比如说数据示例里面的style特征(注意示例中的Drees_ID这一特征我在应用的时候删除了所以df_trainx的第一列就是style),第一个样本是sexy,那么第一行,sexy的那一列是1。第二个样本是casual,那么第二行,casual的列是1。
就相当于一个矩阵,统计列的和,就可以知道频率了。

  1. 对于注释PCA降维的那一块
    sklearn库中的PCA函数先看一下其他参考资料,不然这里要讲好多去了。可以看参考1和参考2里面说的。

具体说一下while sum(pca.explained_variance_ratio_[0: n_component]) < 0.9: n_component += 1

一开始pca.fit(array_trainx)就相当于array_trainx是500样本,每个样本为12维(12个style)
while循环中explained_variance_ratio_返回保留的方差百分比,设阈值为90%。从第一个维(特征)的方差百分比开始算起,一直累计求和,直到≥阈值0.9说明到了我们想要的降维位数n_component(<12),下面再用pca = PCA(n_components=n_component)换成新的维为降维后的n_component。最后array_trainx = pca.fit_transform(array_trainx)把新的维替换掉原来的维

你可能感兴趣的:(python,python,机器学习,大数据)