数据集
数据集划分 ,训练集与 测试集合
python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
from scipy.stats import pearsonr
import jieba
import pandas as pd
# 获取数据集
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("查看数据集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值:\n", iris.data, iris.data.shape)
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("训练集的特征值:\n", x_train, x_train.shape)
特征抽取
让计算机更好理解数据 特征值化
字典特征抽取
python
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=True)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray(), type(data_new))
print("特征名字:\n", transfer.get_feature_names())
文本特征抽取
英文 文本特征抽取 根据空格
python
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words=["is", "too"])
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
中文 文本特征抽取 jieba 分词
python
# 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words=["一种", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
TFIDF
TF 词频 (term frequency,tf) 指的是某一个给定的词语在该文件中出现的频率
IDF - 逆向文档频率 (inverse document frequency,idf) 是一个词语普遍重要性的度
量。某一特定词语的idf 可以由总文件数目除以包含该词语之文件的数目,再将得
到的商取以10为底的对数得到
例子:
假如一篇文件的总词语数是100个,而词语"母牛"出现了3次,那么"母牛"一词在该文件中的词频就是3/100=0.03。
一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过"母牛"一词。所以,如果"母牛"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
python
# 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 1、实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["一种", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
特征预处理
特征单位 或者大小太大 会导致 某些 特征的方差 要比其他特征大几个数量级, 容易支配影响目标结果 例如计算样本距离knn
归一化
例子
x' = (90-60)/(90-60) =1
x'' = 1*1+0=1
python
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = MinMaxScaler(feature_range=[2, 3])
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
缺点 :异常值:最大值、最小值 ,会影响 归一化
标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
X 是数据值,μ 是数据集的平均值,σ 是标准差。
例子
平均值 = (90+60+75)/3 =75
差值 = (90-75) ,(60-75), (75-75) = 15,-15,0
σ 标准差 = √((15^2 +(-15)^2 +0 )/3) = √150=12.25
x' = (90 - (90+60+75)/3)/ 12.25 =1.22
python
# 1、获取数据
data = [[90,2,10,40],[65,4,15,45],[75,3,13,46]]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = StandardScaler()
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组"不相关"主变
量的过程
- 低方差特征过滤
如果特征方差小 那说明特征比较集中 样本值相近
python
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
皮尔逊相关系数
例子
python
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)
特征与特征之间相关性很高:
1)选取其中一个
2)加权求和
3)主成分分析
主成分分析 PCA
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数
据、创造新的变量
作用:是数据维数压缩, 尽可能降低原数据的维数(复杂度),损失少量 信息。回归分类使用
python
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
transfer = PCA(n_components=0.95)
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
降维 案例
python
## 三张表 goods 商品 goods_type 商品分类 goods_orde 用户订单
import pandas as pd
import pymysql
# 连表查出 用户 以及商品分类信息
con = pymysql.connect(host="192.168.12.211",user="root",password="root",db="xl_vip")
data_sql=pd.read_sql("SELECT g.id,g.goods_name,gt.id,gt.`name`,gt.description,gt.parent_id,go.id,go.login_name, go.pay_price from goods_order as go INNER JOIN goods g on go.goods_id=g.id INNER JOIN goods_type as gt on gt.id=g.goods_type_id",con)
== 进行 PCA 降维
from sklearn.decomposition import PCA
transfer = PCA(n_components=0.95)
data_new = transfer.fit_transform(table)