机器学习笔记之sklearn
sklearn是机器学习中重要的测试数据集来源之一,并且可以提供特征提取以及降维聚类等功能
蒟蒻从今天起开始机器学习调库调参的第一步,
sklearn数据集介绍
引入:
数据集的操作有:
- load_*获取自带的较小的数据集
- fetchg_*获取外部的较大的数据集
import sklearn.datasets
from sklearn.datasets import load_iris //导入鸢尾花数据集
iris=load_iris()
print("鸢尾花的数据集返回值",iris)
print("鸢尾花数据的描述",iris["DESCR"])
print("鸢尾花数据的特征值",iris.data)
print("鸢尾花的目标值",iris.target)
print("鸢尾花的特征值名字",iris.data.shape)
print("鸢尾花的特征值名字",iris.feture_name)
sklearn返回值介绍:
- load 和fetch返回的是字典格式
- data:特征数据集
- target:标签数据
- DESCR:数据描述
- feature_names:特征名字,新闻数据,手写数字,回归数据集没有
- target_name:标签名
数据集划分
进行机器学习的时候我们要对数据集进行划分,划分成训练集和测试集
一般来说,测试集所占比例比较少:
- 一般:测试集一般占比20%~30%{sklearn库中划分函数默认25%}
- 训练集特征值,测试集特征值,训练集特征值。测试目标集特征值分别是:x_train x_test y_train y_test
训练集划分api:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris=load_iris()
print("鸢尾花的数据集返回值", iris)
print("鸢尾花数据的描述", iris["DESCR"])
print("鸢尾花数据的特征值", iris.data)
print("鸢尾花的目标值", iris.target)
print("鸢尾花的特征值名字", iris.data.shape)
print("鸢尾花的特征值名字", iris.feature_names)
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
//第一个参数:数据集x的特征值,第二个参数数据集y的特征值,测试集的占比,第三个随机分配时数种子
//返回:训练集特征值,测试集特征值,训练集目标值,测试集目标值
特征提取
即是对一些非数值的数据,比如对文本语音图像等,将其转换成数值化,便于进行矩阵运算
特征提取用于降维等等
特征工程:
一般用sklearn进行特征提取、
而用pandas进行数据清洗,数据抽取,等预处理工作
目标
- 应用DicVectorizer实现对类别特征进行数值化离散化
- 应用CountVectorizer实现对文本特征进行数值化
- 应用TfidVectorizer实现对文本特征进行数值化
特征提取api
sklearn.feature_extraction
对字典进行数值化抽取
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
data = [{'city': 'beijing', 'number': 1}, {'city': 'guangdong', 'number': 4}, {'city': 'shanghai', 'number': 3}]
transfer = DictVectorizer() # 实例化转换器
data_new = transfer.fit_transform(data)
print("data_new:", data_new)
print("data_new的名字:", transfer.feature_names_)#查看矩阵各列代表属性
return None
if __name__ == "__main__":
dict_demo()
返回的矩阵:
data_new: (0, 0) 1.0
(0, 3) 1.0
(1, 1) 1.0
(1, 3) 4.0
(2, 2) 1.0
(2, 3) 3.0
返回的是一个稀疏矩阵,当把稀疏矩阵转换成矩阵形式的时候,设置稀疏矩阵false
transfer = DictVectorizer(sparse=False)
输出:
data_new: [[1. 0. 0. 1.]
[0. 1. 0. 4.]
[0. 0. 1. 3.]]
data_new的名字: ['city=beijing', 'city=guangdong', 'city=shanghai', 'number']
文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
data = ["lfe is short l like python", "life is short ,code more"]
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n",transfer.get_feature_names())#调用此方法获取矩阵的值
return None
if __name__ == "__main__":
count_demo()
同样返回的是一个稀疏矩阵:
data_new:
(0, 2) 1
(0, 1) 1
(0, 7) 1
(0, 4) 1
(0, 6) 1
(1, 1) 1
(1, 7) 1
(1, 3) 1
(1, 0) 1
(1, 5) 1
特征名字:
['code', 'is', 'lfe', 'life', 'like', 'more', 'python', 'short']
#可见过滤了I等低频词汇
#若对中文进行词频抽取,要用空格隔开词语
中文文本抽取
from sklearn.feature_extraction.text import CountVectorizer(stop_word=[])
这里的stop_word是跳过词,抽取时忽略这个词,自然语言处理时用停顿词表进行无关词语忽略
这里把把is和like作为停顿词
transfer = CountVectorizer(stop_words=['is', 'like'])
输出特征名字:
[‘code’, ‘lfe’, ‘life’, ‘more’, ‘python’, ‘short’]
中文文本抽取:
由于中文文本在CountVectorizer中使用必需分词,所以要调用jieba的分词函数
import jieba # 对中文文本进行分词处理
def cut_word(text):
# 中文文本分词函数
text = "".join(list(jieba.cut(text)))
# jibe分词函数->转化成;列表—>转化成字符串
return text
def count_Chinese():
data = ["一种还是一种今天很残酷,明天更加残酷,但是对大部分人来说", "进行机器学习的时候我们要对数据集进行划分,划分成训练集和测试集", "一般来说,测试集所占比例比较少",
"训练集特征值,测试集特征值,训练集特征值。测试目标集特征值分别是:x_train x_test y_train y_test"]
data_new = []
for i in data:
data_new.append(cut_word(i))
print(data_new)
return None
if __name__ == "__main__":
count_Chinese()
然后对生成列表进行特征抽取
然而这样的特征抽取没有突出高频率词汇,所以要对高频率词汇进行提取
但是有些词比较辣鸡,不该作为信息抽取
文本特征抽取2
关键词:在某一个类别的文章中出现次数多,但在其他文章中出现次数少的词汇,标志了一个文本的特征
Tf-idf文本特征抽取原理即是如此
tf:词频
idf:逆向文本频率:
由文本文件数目除以包含词语的文件的数目,再将得到的商取以10为底的对数
Tf-idf=tf*idf
举例:
语料库:1000文章
100文章有非常
10偏有经济
两篇文章:
A文章(100词):经济10词
‘经济’:
tf=0.1
idf=log 10 1000/10=2
Tf-idf=0.2
B文章(100词):非常10词
‘非常’:
tf=0.1
idf=log 10 1000/100=1
Tf-idf=0.1
ApI
from sklearn.feature_extraction.text import TfidfVectorizer
def Tfidf_demo():
data = ["lfe is short l like python", "life is short ,code more"]
transfer = TfidfVectorizer(stop_words=['is', 'like'])
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
#就实例化的时候改了下转换器的名字
if __name__ == "__main__":
Tfidf_demo()
实例化和提取操作类似于CountVectorizer,同样有停顿词功能
返回:
data_new:
(0, 4) 0.6316672017376245
(0, 5) 0.4494364165239821
(0, 1) 0.6316672017376245
(1, 3) 0.534046329052269
(1, 0) 0.534046329052269
(1, 2) 0.534046329052269
(1, 5) 0.37997836159100784
特征名字:
['code', 'lfe', 'life', 'more', 'python', 'short']
数据预处理
归一化
为了使数据更加适合算法模型处理
归一化就是在将数据处理在一定中范围内
如果不对数据进行归一化处理,那么数据将会由于某一个特征值过于巨大而导致其他特征值被忽略,(在聚类中的欧式距离计算中尤为明显)
所以要将几个数据项的值固定在一个统一的范围内:
数学上叫做无量纲化
公式
x'=(x-min)/(max-min)
x''=x'*(mx-mi)+mi
例如有数据[90,60,75]
对于数据90:
x’=(90-60)/(90-60)=1
x”=1*(1)+0=1 #放缩到1-0区间,mx=1,mi=0
ApI:
import pandas as pd#调用pandas清洗函数
from sklearn.preprocessing import MinMaxScaler#调用归一化函数
def minmax():
data=pd.read_csv("titanic/test.csv")
data=data.iloc[:6, :2]
#截取数据前两列前6行
trans=MinMaxScaler()#实例化转换器
datanew=trans.fit_transform(data)
print(datanew)
return None
if __name__ == "__main__":
minmax()
输出:
[[0. 1. ]
[0.2 1. ]
[0.4 0. ]
[0.6 1. ]
[0.8 1. ]
[1. 1. ]]
这样在处理聚类数据的时候可以减少特征值之间的差距
标准化处理
当数据中有缺失值和异常值,做归一化处理得到的数据可能会有缺陷,这种方式鲁棒性较差,只适合传统的精确度小的数据处理
异常值通常是:
- 最大值
- 最小值
标准化定义
对原始数据变换将数据变为均值为0,标准差为1
公式:
x’=(x-mean)/std
std=标准差
API
from sklearn.preprocessing import MinMaxScaler,StandardScaler
#即在原来归一化基础上实例的时候改了转换器就行
def std_demo():
data = pd.read_csv("titanic/test.csv")
data = data.iloc[:6, :2]
# 截取数据前两列前6行
trans = StandardScaler() # 实例化转换器
datanew = trans.fit_transform(data)
print(datanew)
return None
if __name__ == "__main__":
std_demo()
返回:
[[-1.46385011 0.4472136 ]
[-0.87831007 0.4472136 ]
[-0.29277002 -2.23606798]
[ 0.29277002 0.4472136 ]
[ 0.87831007 0.4472136 ]
[ 1.46385011 0.4472136 ]]
降维
降维是在某些限定的条件,降低随机特征的个数,得到一组不相关主变量的过程
维数:嵌套层数
- 0维:标量
- 1维:向量
- 2维:矩阵
降低的对象:二维数组
此处降维:降低列数
- 相关特征:
- 相对湿度与降雨量之间的关系
- 等等
正是因为在进行训练的时候,我们都是使用特征进行学习的,如果有特征本身存在问题或者特征之间相关性比较强,对于算法学习的预测影响会比较大
降维的两种方法:
- 特征选择
- 主成分分析
特征选择:
数据中包含冗余的或相关变量,希望在原有特征中找出主要特征
方法:
- filter过滤式
- 方差选择法:低方差特征过滤(说明此属性共有不必要)
- 相关系数法:特征与特征之间的相关程度
- embeded嵌入式
- 决策树
- 正则化
- 深度学习
低方差特征过滤
API
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
def varianse_demo():
# 过滤低方差
data = pd.read_csv("titanic/test.csv")
data = data.iloc[:5, :2]
transfer = VarianceThreshold()
data = transfer.fit_transform(data)
print(data)
return None
if __name__ == "__main__":
varianse_demo()
相关系数
皮尔森相关系数:
公式略
特点:
- 当r>0正相关,R<0负相关
- 当r=-1or1完全相关,r=0表示毫无关系
- 越近于1相关性越强
- 0.4<abs(r)<0.7说明有一定相关性
Api:
import pandas as pd
from scipy.stats import pearsonr
def varianse_demo():
# 过滤低方差
data = pd.read_csv("titanic/test.csv")
data = data.iloc[:5, :2]
r = pearsonr(data["pe_ratio"], data["pb_ratio"])
print(r)
return None
if __name__ == "__main__":
varianse_demo()
如果特征与多个特征之间相关性很高:
选取其中一个
加权求和
主成分分析