Python数据挖掘-机器学习
目录
(1)字典特征提取:sklearn.feature_extraction.DictVectorizer()
(2)文本特征提取1:sklearn.feature_extraction.text.CountVectorize()
(3)文本特征提取2:sklearn.feature_extraction.text.TfidfVectorizer()
(1)归一化:将原始数据变换映射到[0,1]之间:MinMaxScaler
(2)标准化:对原数据变换把数据变为均值为0,标准差为1范围内:StandardScaler()
(1)转换器:Transformer\fit_transform()【特征工程的父类】
零、概念
机器学习:从数据中自动分析获得模型,并利用模型对位置数据进行预测
数据集(机器学习所要学习的数据):特征值(基础属性) [ + 目标值(所求问题) ]
分类问题:目标值为类别
回归问题 :目标值为连续型(目标值与特征值有关联)的数据
无监督学习:没有目标值(有目标值的均为监督学习)
算法:
监督学习:knn算法、贝叶斯分类、决策树与随机森林、逻辑回归
无监督学习:聚类k-means
开发流程:
获取数据、数据处理、特征工程、算法训练-模型、模型评估、应用
一、机器学习概述
1.数据集
(1)sklearn自带数据集应用
sklearn.datasets.load_*:小数据集
sklearn.datasets.fetch_*:大数据集
(2)数据集划分
原理:将原数据取一部分出来当作预测值,来证明学习后得到的预测结果符合要求(模型评估)
x_train,x_test,y_train,t_test=sklearn.model_selection.train_test_split()
传入:数据集的特征值;数据集的目标值;test_size测试集的大小,一般为float;random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return: 训练集特征值(x_train),测试集特征值(x_test),训练集目标值(y_train),测试集目标值(y_test)。
二、特征工程
1.特征抽取
补充:将任意数据转换为可用于机器学习的数字特征(原始数据特征值化,方便处理)
(1)字典特征提取:sklearn.feature_extraction.DictVectorizer()
补:类别转换为编码
DIctVectorizer().fit_transform(x):转换数据
DIctVectorizer().get_feature_names_out():返回类别名(转换完数据才能查看)
from sklearn.feature_extraction import DictVectorizer
def sk():
data=[{'city':'北京',"temperature":23},
{'city':'上海',"temperature":29},
{'city':'广州',"temperature":32}]
transfer1 = DictVectorizer()#实例化方法;sparse=True为稀疏矩阵
transfer2=DictVectorizer(sparse=False)
data_new1=transfer1.fit_transform(data) #调用fit_transform
data_new2 = transfer2.fit_transform(data)
print(data_new1)#稀疏矩阵就是将非0值的位置表示出来
print(data_new2)
#1图为稀疏矩阵


(2)文本特征提取1:sklearn.feature_extraction.text.CountVectorize()
补充:统计文本特征词出现的次数
CountVectorize(stop_words=["","",...]):参数可带停用词
CountVectorize().fit_transform(x):转换数据
CountVectorize().get_feature_names_out():返回类别名(转换完数据才能查看)
from sklearn.feature_extraction.text import CountVectorizer
def count():
data=["life is short, i like like python","life is too long,i dislike python"]
transfer=CountVectorizer()#文本没有sparse属性
data_new = transfer.fit_transform(data)
print(data_new.toarray())#用toarray()转化为非稀疏矩阵
print(transfer.get_feature_names_out())

(3)文本特征提取2:sklearn.feature_extraction.text.TfidfVectorizer()
补充:TF是词频; IDF 是词语普遍重要度;TF-IDF指标显示对文章本身的重要程度
(实现中文的具体案例写在另一篇文章中)
2.特征预处理:sklearn.preprocessing
补:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程
(1)归一化:将原始数据变换映射到[0,1]之间:MinMaxScaler
原因:某些特征方差比其它特征要大很多,容易影响目标结果,为了让特征同等重要——>无量纲化
from sklearn.preprocessing import MinMaxScaler
def guiyi(data):
transfer=MinMaxScaler(feature_range=[2,3])#默认区间为[0,1]
new_data=transfer.fit_transform(data)
print(new_data)
(2)标准化:对原数据变换把数据变为均值为0,标准差为1范围内:StandardScaler()
补:较稳定,不易受到异常值影响,非常适合应用

from sklearn.preprocessing import StandardScaler
def biaozhun(data):
transfer = StandardScaler()
new_data = transfer.fit_transform(data)
print(new_data)
3.降维
补:若特征之间相关性较强,对算法学习预测影响较大。所以需要降低特征个数,使特征与特征不相关(去除冗余特征,将特征转换为线性无关的特征)
(1)特征选择
低方差特征过滤:sklearn.feature_selection.VarianceThreshold(threshold=0.0)
from sklearn.feature_selection import VarianceThreshold
def difangcha(data):
#特征太过接近会使方差趋于小进而进行过滤
transfer=VarianceThreshold(threshold=10)#设置阈值过滤小于等于阈值的数据
new_data=transfer.fit_transform(data)
print(new_data)
相关系数:Pearson相关系数r
from scipy.stats import pearsonr
def P(data):
r=pearsonr(data["x"],data["y"])
print(r)#一般会输出两个数,第一个数为r。|r|越接近1则越相关
#后面的数为P值,显著性系数,衡量r的有效性,一般<0.05才说明r有意义
#两个数据相关性很高时:1.选取其中一个作为代表;2.加权求和;3.主成分分析
(2)主成分分析(PCA)
作用:降低降维后的数据的信息损失(例如:拍照的角度)
from sklearn.decomposition import PCA
def pca():
data=[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
transfer=PCA(n_components=2)
# n_components=2是将特征变为两个;n_components=0.95是保留95%的信息
data_new=transfer.fit_transform(data)
print(data_new)
三、分类算法
补:看目标值是否为类别
1.sklearn转换器和估计器
(1)转换器:Transformer\fit_transform()【特征工程的父类】
fit():计算每一列的平均值、标准差
transform():进行最终转换
(2)估计器:estimator
1.实例化一个estimator()
2. estimator.fit(x_train,y_train) 计算
3.评估1,对比预测值和真实值:y_predict=estimator.predict(x_test)
评估2,计算准确率:accuracy=estimator.score(x_test,y_test)
2.KNN算法
核心:通过k个“邻居”推断类别
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors=5,k值
algorithm='auto',默认自动匹配最优算法
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
#1)获取数据
iris=load_iris()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=6)
#3)标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,
#所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以
#4)knn估计器
estimator=KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
#5)模型评估
# 1.对比真实值和预测值
y_predict=estimator.predict(x_test)
print("真实值和预测值比对\n",y_test==y_predict)
# 2.计算准确率
score=estimator.score(x_test,y_test)#测试集的特征值,测试集的目标值
#模型评估阶段是在测试集test上做的,和train无关了
#给score传x_test,它会自动算出y_test的估计值,再和你真正的y_test比较计算得分
print("准确率为\n",score)

缺点:必须指定k值以及k值选择不当时精度不能保证;适用于10w以下级别的小数据场景
3.模型选择与调优
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
补:解决选择k值的问题
(1)交叉验证:CV(cross validation)

(2)网格搜索(Grid Search)
自动遍历K值比对准确率
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
def knn_iris_gscv():
#1)获取数据
iris=load_iris()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=6)
#3)标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4)knn估计器
estimator=KNeighborsClassifier()
#加入网格搜索和交叉验证
param_dict={"n_neighbors":[1,3,5,7,9,11]}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=10)
estimator.fit(x_train,y_train)
#5)模型评估
# 1.对比真实值和预测值
y_predict=estimator.predict(x_test)
print("真实值和预测值比对\n",y_test==y_predict)
# 2.计算准确率
score=estimator.score(x_test,y_test)
print("准确率为\n",score)#整体测试集的效果
#网格搜索与交叉验证结果的参数
print("最佳参数\n",estimator.best_params_)
print("最佳结果\n",estimator.best_score_)#验证集中的结果
print("最佳估计器\n",estimator.best_estimator_)
print("交叉验证结果\n",estimator.cv_results_)
4.朴素贝叶斯算法
sklearn.native_bayes.MultinomialNB(alpha=0.1)

核心: 朴素+贝叶斯:特征与特征之间相互独立+贝叶斯公式
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
def nb_news():
#1)获取数据
news=fetch_20newsgroups(subset="all")
#2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data,news.target)
#3)特征抽取
transfer=TfidfVectorizer()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4)贝叶斯算法预估器
estimator=MultinomialNB()
estimator.fit(x_train,y_train)
# 5)模型评估
# 1.对比真实值和预测值
y_predict = estimator.predict(x_test)
print("真实值和预测值比对\n", y_test == y_predict)
# 2.计算准确率
score = estimator.score(x_test, y_test)
print("准确率为\n", score) # 整体测试集的效果

缺点:如果特征属性有关联时效果不好
5.决策树
(1)算法
核心:找到高效的决策顺序
sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None.random_state=None)
criterion:默认是'gini'也可以选择信息增益的熵'entropy'
max_depth:树的深度大小
random_state:随机数种子
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
def tree_iris():
#1)获取数据
iris=load_iris()
#2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target,random_state=22)
#3)可进行特征提取
#4)决策树预估器
estimator=DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train,y_train)
#5)模型评估
# 1.对比真实值和预测值
y_predict = estimator.predict(x_test)
print("真实值和预测值比对\n", y_test == y_predict)
# 2.计算准确率
score = estimator.score(x_test, y_test)
print("准确率为\n", score) # 整体测试集的效果

(2)决策树可视化
sklearn.tree.export_graphviz(estimator,out_file='tree.dot',feature_names=['',''])
from sklearn.tree import export_graphviz
export_graphviz(estimator,out_file="./iris.tree.dot",feature_names=iris.feature_names)
#传入估计器、文件输出路径、特征名

缺点:容易过拟合
6.随机森林
核心:多个决策树的分类器
(1)训练集随机:bootstrap随机有放回抽样
(2)特征随机:从M个特征随机抽取m(M>>m)个特征(降维)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
#森林一般放在字典特征抽取后,制作预估器时用到
estimator=RandomForestClassifier()
#网格搜索与交叉验证
param_dict={"n_estimators":[120,200,300,500,800,1200],#树林里树木数量
"max_depth":[5,8,15,25,30]#最大深度}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)#cv值小一点
estimator.fit(x_train,y_train)
#5)模型评估
# 1.对比真实值和预测值
y_predict=estimator.predict(x_test)
print("真实值和预测值比对\n",y_test==y_predict)
# 2.计算准确率
score=estimator.score(x_test,y_test)
print("准确率为\n",score)#整体测试集的效果
#网格搜索与交叉验证结果的参数
print("最佳参数\n",estimator.best_params_)
print("最佳结果\n",estimator.best_score_)#验证集中的结果
print("最佳估计器\n",estimator.best_estimator_)
print("交叉验证结果\n",estimator.cv_results_)
(3)案例
树、决策森林案例:泰坦尼克号乘客生存预测_代码熬夜敲Q的博客-CSDN博客
四、回归与聚类(无监督)算法
1.线性回归(目标值不连续)
特征值与目标值的函数关系
(1)优化算法-正规方程
直接求解,特征过多时速度慢结果差
(2)优化算法-梯度下降
多次迭代改进
(3)性能评估:均方误差MSE
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.metrics import mean_squared_error
def linear1():
#1)获取数据
boston=load_boston()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
#3)标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4)预估器
estimator=LinearRegression()
estimator.fit(x_train,y_train)
#5)得出模型
print("正规方程权重系数为",estimator.coef_)
print("正规方程偏置为",estimator.intercept_)
#6)模型评估
y_predict=estimator.predict(x_test)
error=mean_squared_error(y_test,y_predict)
print("正规方程均方误差为",error)
def linear2():
#1)获取数据
boston=load_boston()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
#3)标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#4)预估器
estimator=SGDRegressor()
estimator.fit(x_train,y_train)
#5)得出模型
print("梯度下降权重系数为",estimator.coef_)
print("梯度下降偏置为",estimator.intercept_)
#6)模型评估
y_predict = estimator.predict(x_test)
error = mean_squared_error(y_test, y_predict)
print("梯度下降均方误差为", error)
2.欠拟合与过拟合
(1)欠拟合:机器学习到的特征太少
解决:增加特征数量
(2)过拟合:机器学习到的特征太多
解决:正则化
L1正则化:删除特征的影响
L2正则化(常用):削弱特征的影响
3.岭回归
带有L2正则化的线性回归
from sklearn.linear_model import Ridge
def linghuigui():
# 1)获取数据
boston = load_boston()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)预估器
estimator = Ridge()
estimator.fit(x_train, y_train)
# 5)得出模型
print("岭回归权重系数为", estimator.coef_)
print("岭回归偏置为", estimator.intercept_)
# 6)模型评估
y_predict = estimator.predict(x_test)
error = mean_squared_error(y_test, y_predict)
print("岭回归均方误差为", error)
4.逻辑回归(分类算法)与二分类问题(属于/不属于)
from sklearn.linear_model import LogisticRegression
5.模型保护和加载
import joblib
#保存,一般放在预估器生成后面
joblib.dump(estimator,"my_ridge.pkl")
#加载模型,可以直接用estimator查看属性
estimator=joblib.load("my_ridge.pkl")
6.无监督学习-K-means算法:分类
(1)原理
随机设置个特征空间内的点作为聚类中心,逐渐找到分堆的最中心
from sklearn.cluster import KMeans
estimator=KMeans(n_clusters=3)
(2)评估
轮廓系数:取值范围[-1,1],越接近于1越好
from sklearn.metrics import silhouette_score
silhouette_score(data_new,y_predict)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
https://blog.csdn.net/qq_59081708/article/details/129557870




所有评论(0)