目录
可用数据集
scikit-learn
kaggle
UCI
数据集的结构包括 特征值+目标值
机器学习中,数据中有重复值不需要去重
特征工程
原始数据转换为更好地代表预测模型的潜在问题的特征的过程,提高预测准确性
数据的特征抽取
对文本等数据进行特征值化
sklearn是python一个库
import sklearn
sklearn.feature_extraction 特征抽取API
对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer
DictVectorizer(spqrse=True,...)
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
可以使用 from sklearn.feature_extraction import DictVectorizer 导入
把字典中一些类别的数据,分别进行转换成特征;一些数值类型的数据,直接转换为数据
数组形式,有类别的这些特征,先要转换为字典数据
DictVectorizer(spqrse=False) 得到的是one-hot编码,把字典中类别的数据转换为one-hot编码,利于分析
文本特征抽取
对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer
CountVectorizer()
返回词频矩阵
CountVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式
CountVectorizer.get_feature_names()
返回单词列表
可以使用 from sklearn.feature_extraction.text import CountVectorizer 导入
CountVectorizer()里面没有sparse,所以可以使用.toarray()实现该效果
统计文中所有词,重复的只看作一次,生成词的列表,然后对每篇文章,在词的列表里面统计每个词出现次数。单个字母不统计
文本特征抽取:Count
因为分词默认是以逗号或者空格分词,所以对于一句中文,只能识别为一个词,使用jieba分词解决该问题
import jieba
jieba.cut("中文句子")
返回值:词语生成器
con1=jieba.cut("中文") #分词
content1=list(con1) #转换为列表
c1=' '.join(content1) #把列表转换为字符串并以空格分开
单个汉字不会被统计
TfidfVectorizer
TfidfVectorizer(stop_words=None,...)
返回词的权重矩阵
TfidfVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式
TfidfVectorizer.get_feature_names()
返回单词列表
可以使用 from sklearn.feature_extraction.text import TfidfVectorizer 导入
tf:term frequency idf:逆文档频率 inverse document frequency
tf 词出现的次数
log(总文档数量/该词出现的文档数量)
tf*idf 该值越高,词的重要性越大
tf idf相比于上两种方式要好
数据的特征预处理
通过特定的统计方法,将数据转换成算法要求的数据
数值型数据:标准缩放:
1.归一化 2.标准化 3.缺失值
类别型数据:one-hot编码
时间类型:时间的切分
sklearn特征处理API sklearn.preprocessing
归一化
几个特征同等重要的时候,进行归一化,使得各个特征不会对最终结果造成更大的影响
通过对原始数据变换把数据映射到0-1之间
公式:
作用于每一列,max为一列的最大值,min为一列的最小值,那么为最终结果,mx mi分别为指定区间值,默认mx为1,mi为0
sklearn归一化API:sklearn.preprocessing.MinMaxScaler
MinMaxScaler(feature_range=(0,1)...) 每个特征缩放到给定范围(默认0-1)
MinMaxScaler.fit_trasform(X)
x:numpy array格式的数据 [n_samples,n_features]
返回值:转换后的形状相同的array
归一化缺点:如果有异常点,容易影响最大值最小值,鲁棒性不好,不稳定,只适合传统精确小数据场景
标准化
对原数据进行转换,把数据变到均值为0,方差为1的范围内
公式:
作用于每一列,mean平均值,标准差
sklearn标准化API:sklearn.preprocessing.StandardScaler
StandardScaler(...)
处理之后每列所有数据都聚集在均值0附近,标准差为1
StandardScaler.fit_transform(X)
x:numpy array格式的数据[n_samples,n_features]
返回值:转换后形状相同的array
StandardScaler.mean_
原始数据中每列特征的平均值
StandardScaler.std_
原始数据中每列特征的方差
少量异常点对平均值和方差影响小,在样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
缺失值
删除或者插补
插补更常用:常按特征值列的平均值、中位数填补
Imputer(missing_values='NaN',strategy='mean',axis=0) axis=0是按列,1按行
完成缺失值插补
Imputer.fit_transform(X)
x:numpy array格式的数据[n_samples,n_features]
返回值:转换后形状相同的array
注意:这里只能识别np.nan这样的数据缺失值,例如:可以使用pandas里面的replace("?",np.nan)将内容为问号的值替换为可识别的缺失值np.nan
numpy的数组中可以使用np.nan或np.NaN代替缺失值,属于float类型
如果是文件中的一些缺失值,可以替换成nan,通过np.array转换成float型的数组即可
数据降维
维度:特征的数量
特征选择:原因:1.冗余:消耗计算性能 2.噪声:影响预测结果
方式:过滤式、嵌入式、包裹式
过滤式:从方差大小来考虑所有样本这个特征的数据情况
sklearn.feature_selection.VarianceThreshold
VarianceThreshold(threshold=0) 这个取值没有最优,一般在0-10之间
删除所有低方差特征(因为低方差数据基本一样)
VarianceThreshold.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练差异低于threshold的将被删除,默认为0,保留所有非0方差的特征
PCA
是一种分析和简化数据集的技术
使数据维数压缩,尽可能降低原数据维数(复杂度),损失少量信息
PCA(n_components=None) n_components如果是小数,0-1之间,表示保留原数据的程度 如果是整数,表示减少后的特征数量,一般用小数(90%-95%)
PCA.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
线性判别分析LDA
机器学习基础
算法是核心,数据和计算是基础
数据类型
离散型数据
连续型数据
离散型区间内不可分,连续型可分
机器学习算法分类
监督学习(预测)
有特征值和目标值
分类:目标值是离散型
回归:目标值是连续型
标注
无监督学习
只有特征值
机器学习开发流程
数据:1.公司本身就有数据
2.合作过来的数据
3.购买的数据
1.原始数据:明确问题做什么,建立模型 根据目标值数据类型划分应用种类
2.数据的基本处理:用pd处理数据(缺失值,合并表...)
3.特征工程(特征进行处理) (重要)
模型:算法+数据
4.找到合适算法进行预测
5.模型的评估,判定效果
合格:上线使用,以API形式提供
不合格:1.换算法、参数 2.特征工程
sklearn数据集和估计器
数据集
数据分为训练集和测试集
样本按70% 30%或80% 20%或75% 25%划分,常用75% 25%
训练数据用于训练,构建模型
测试数据用于检验,评估模型是否有效
API:sklearn.model_selection.train_test_split
sklearn.datasets 加载获取流行数据集
datasets.load_*() 获取小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home=None) 获取大规模数据集,需要从网络上下载,函数的第一个参数data_home表示数据集下载的目录,默认是~/scikit_learn_data/
load*和fetch*返回的数据类型datasets.base.Bunch(字典格式)
包括: data:特征数据数组,[n_samples * n_features]二维numpy.ndarray数组
target:标签数组,是n_samples一维numpy.ndarray数组
DESCR:数据描述
feature_names:特征名,新闻数据、手写数字、回归数据集没有这个
target_names:标签名
sklearn分类数据集
sklearn.datasets.load_iris() 加载并返回鸢尾花数据集
sklearn.datasets.load_digits() 加载并返回数字数据集
数据集进行分割
sklearn.model_selection.train_test_split(*arrays,**options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果,相同种子采样结果相同
return 训练集特征值,测试集特征值,训练标签,测试标签(默认随机取)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
li = load_iris()
# print("获取特征值")
# print(li.data)
# print("目标值")
# print(li.target)
# print(li.DESCR)
# 注意返回值, 训练集 train x_train, y_train 测试集 test x_test, y_test
x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)
print("训练集特征值和目标值:", x_train, y_train)
print("测试集特征值和目标值:", x_test, y_test)
用于分类的大数据集(新闻)
sklearn.datasets.fetch_20newsgroups(data_home=None,subset='train')
data_home:下载目录
subset:'train'或者'test','all'可选,选择要加载的数据集,训练集的“训练”,测试集的“测试”,两者的“全部”
from sklearn.datasets import load_iris, fetch_20newsgroups
from sklearn.model_selection import train_test_split
news = fetch_20newsgroups(subset='all')
print(news.data)
print(news.target) #获取里面的特征值和目标值
datasets.clear_data_home(data_home=None) 清除目录下的数据
sklearn回归数据集
sklearn.datasets.load_boston() 加载并返回波士顿房价数据集
sklearn.datasets.load_diabetes() 加载和返回糖尿病数据集
监督学习
估计器:分类估计器 回归估计器
1.调用数据 fit(x_train,y_train)
2.输入测试集的数据
1:y_predict=predict(x_test)
2:预测的准确率:score(x_test,y_test)
分类算法——k近邻算法(KNN)和朴素贝叶斯算法
k近邻算法(KNN)
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)样本中,大多数属于一个类别,那该样本也属于这个类别
距离公式:欧式距离
两个样本a(a1,a2,a3), b(b1,b2,b3)
K-近邻算法之前要进行标准化 fit_transform()
API:sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors:int,默认等于5,查询默认使用的邻居数
实例中数据处理用到的函数:
1.缩小数据集范围
DataFrame.query()
2.处理日期数据
pd.to_datetime
pd.DatetimeIndex
3.把时间戳变为分割开的日期数据
4.删除没用的日期数据
DataFrame.drop() axis=1是列
5.将签到位置少于n的用户删除
place_count=data.groupby('place_id').count()
tf=place_count[place_count.row_id>n].reset_index()
data=data[data['place_id'].isin(tf.place_id)]
实例流程:
1.数据集处理
2.分割数据集
3.数据集标准化
4.估计器进行分类预测
k—近邻算法
k值取很小,容易受异常点影响
k值取很大,容易受k值数量(类别)波动影响 最好k个近邻都是同一个样本
算法缺点:性能问题,时间复杂度高 k需要提前设定,设定不好精度不高
优点:简单,无需参数估计(n_neighbors不是算法内部参数,是超参数),无需训练
使用场景:小数据场景,几千到几万样本,具体场景具体业务中测试
朴素贝叶斯算法
贝叶斯公式、拉普拉斯平滑
API:sklearn.naive_bayes.MultinomialNB(alpha=1.0) alpha:拉普拉斯平滑系数
缺点:训练集误差大的话,结果不好,是做了样本中属性独立的假设,如果事实是不独立,结果不准确
优点:分类准确,速度快,算法简单,对缺失数据不敏感,不需要调参
分类模型的评估
准确率
estimator.score()
精确率(一般不考虑)
预测结果为正例的样本中,真实为正例的比例
召回率(查的全,对正样本的区分能力)
真实为正例的样本中,预测结果为正例的比例
API:sklearn.metrics.classification_report(y_true,y_pred,target_names=None)
y_true 真实目标值
y_pred 估计器预测目标值
target_names 目标类别名称
return 每个类别精确率和召回率
模型的选择与调优
交叉验证和网格搜索对K—近邻算法调优
交叉验证:所有数据分成n等分,为了让模型更加准确可信
超参数搜索/网格搜索:调参数
每组超参数都用交叉验证进行评估,多个超参数两两组合,最后选出最优参数组合(一般使用十折交叉验证)
API:sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
estimator:估计器对象(比如说knn)
param_grid: 估计器参数(超参数)之前先构造超参数的一些值,字典格式,param={“n_neighbors”:[3,5,10]} param_grid=param
cv: 指定几折交叉验证
此外还需要:
fit: 输入训练数据 fit(x_train,y_train)
score:准确率 score(x_test,y_test)
结果分析:
best_score_:在交叉验证中验证的最好结果
best_estimator_: 最好的参数模型
cv_results_: 每次交叉验证后测试集准确率结果和训练集准确率结果
分类算法——决策树和随机森林
决策树
信息论基础
决策树的分类依据之一 信息增益:当得知一个特征条件后,减少的信息熵大小
常见决策树使用的算法:ID3 信息增益 最大的准则
C4.5 信息增益比 最大的准则
CART 回归树:平方误差最小
分类树: 基尼系数 最小的准则
API:sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)
criterion:默认是'gini‘系数,也可以选择信息增益的熵’entropy‘
max_depth:树的深度大小
random_state:随机数种子
决策树优点:简单的理解和解释,树木可视化
需要很少的数据准备
缺点:会创建不能很好的推广数据的过于复杂的树,过拟合
改进:减枝cart算法(决策树API中已经实现)
随机森林
集成学习方法:随机森林
生成多个分类器/模型,随机森林是包含多个决策树的分类器,输出的类别是由个别树输出的类别的众数决定
随机森林建立多个决策树的过程:
单个树的建立过程:1.随机在N个样本当中选择一个样本,重复N次 随机有返回的抽样(bootstrap抽样),样本有可能重复
2.随机在M个特征中选出m个特征
例如建立10棵决策树,其中样本和特征大多不一样
API:sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None)
n_estimators:integer 是超参数,可选(default=10) 一般森林里的树木数量120,200,300,500,800,1200
criteria:string 可选(default="gini")分割特征的测量方法
max_depth:integer或None 是超参数,可选(默认=无),树的最大深度5,8,12,25,30
max_features="auto" 是超参数,每个决策树的最大特征数量 其中“auto”,最大数量=总特征数开根号 “sqrt”与auto一样 “log2”是总特征数以2为底求对数
bootstrap:boolean 可选(default=True)是否在构建树时使用放回抽样
结果分析:
score 准确率
best_params_ 查看选择的最优参数模型
随机森林优点:
有极好的准确率,能在大数据上运行,能处理高维特征的输入样本,不需要降维,能评估各个特征在分类问题中的重要性
回归算法
线性回归:寻找一种能预测的趋势
线性关系:二维:直线关系 三维:特征,目标值,在平面当中
线性关系定义:
y=wx+b b:偏置 w:权重
通用公式:
其中,w,x为矩阵,,
通过属性和权重的组合来预测结果
相当于 x:特征值 w:权重 h:目标值
损失函数(误差大小)
总损失定义:每个训练样本特征值预测得到的目标值与样本真实值差的平方和(误差的平方和),又称最小二乘法
优化过程是,寻找最小的损失
最小二乘法之正规方程
sklearn.linear_model.LinearRegression()
返回值: coef_:回归系数
最小二乘法之梯度下降 其中包括超参数α学习速率
sklearn.linear_model.SGDRegressor()
返回值: coef_:回归系数 就是最小损失
线性回归同k—近邻一样,也需要标准化处理,特征值和目标值都要进行标准化处理,而且要实例化两个标准化API
回归性能评估
(均方误差MSE)评价机制:
为预测值,
为真实值
均方误差回归损失API:
mean_squared_error(y_true,y_pred)
y_true:真实值
y_pred:预测值
return:浮点数结果
注意:真实值和预测值都是标准化之前的值
过拟合和欠拟合
过拟合:在训练数据上获得比其他假设更好的拟合,在训练数据以外数据集上却不能很好的拟合数据(模型过于复杂)
欠拟合:在训练数据上不能获得更好的拟合,在训练数据外的数据集上也不能很好的拟合数据(模型过于简单)
要根据结果现象(通过交叉验证)来判断是过拟合还是欠拟合:
训练集结果:表现不行+测试集结果:表现不行==》欠拟合
训练集结果理想(比如99%,均方误差2.0),测试集89%,均方误差10.0,与训练集结果相差太大,==》过拟合
欠拟合原因:学习到数据的特征太少 解决方法:增加数据的特征数量
过拟合原因:原始特征过多,存在嘈杂特征,使模型复杂 解决方法:正则化
正则化和岭回归
L2正则化:使权重缩小到接近0
线性回归容易出现过拟合,为了把训练集数据表现更好,使用L2正则化
Ridge岭回归 带有正则化的线性回归,解决过拟合
API:sklearn.linear_model.Ridge(alpha=1.0)
alpha:(超参数,0-1,1-10都可)正则化力度,对权重的影响 正则化力度增大,权重会越来越小,模型越来越简单
coef_:回归系数
岭回归比线性回归更可靠,更符合实际,对于病态数据较多的样本更有效
模型的保存与加载
from sklearn.externals import joblib
API: 保存 joblib.dump(模型的名称,(文件路径)'./temp/test.pkl')
加载 estimator=joblib.load((文件路径)'./temp/test.pkl')
分类算法——逻辑回归
线性回归的式子作为逻辑回归的输入,解决二分类问题
线性回归的输入===》通过sigmoid函数===》转化为[0,1]区间的概率值 默认0.5作为阈值,小于0.5概率归为0,大于0.5概率归为1
API:sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)
penalty:超参数,正则化
C:超参数
coef_:回归系数
优点:适合需要得到一个二分类概率的场景,简单速度快
缺点:不适用于多分类
逻辑回归和朴素贝叶斯比较
解决问题 二分类 多分类
应用场景 二分类需要概率 文本分类
参数 正则化力度 无
判别模型(K——近邻,决策树,随机森林,神经网络都是判别模型) 生成模型(需要从历史数据总结出先验概率)
非监督学习
k-means
K:把数据划分成多少个类别
API: sklearn.cluster.KMeans(n_clusters=8,init='k-means++')
n_clusters:超参数,开始聚类的中心数量 (如果知道要分为几类就把n_clusters设为几,不知道的话n_clusters就是超参数)
init:初始化方法
labels_:默认标记的类型,可以和真实值比较
聚类评估标准:
轮廓系数:[-1,1] 结果最好:1 结果最差:-1
sklearn.metrics.silhouette_score(X,labels)
X:特征值
labels:被聚类标记的目标值