目录
- 机器学习
- 特征工程
- 1.特征抽取
- 2.特征处理
- 2.1 归一化:传统精确小数据
- 2.2 标准化:大多数情况
- 3.数据降维
- 3.1特征选择
- 3.2主成分分析PCA
- 案例:超市订单分析
机器学习
监督学习:输入数据有特征有标签,即有标准答案
-
分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
-
回归:线性回归、岭回归
-
标注:隐马尔可夫模型 (不做要求)
无监督学习:输入数据有特征无标签,即无标准答案
- 聚类:k-means
特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
1.特征抽取
通过演示得出结论:
• 特征抽取针对非连续型数据
• 特征抽取对文本等进行特征值化
字典特征抽取:对字典数据进行特征值化
One—hot编码
# 特征抽取
# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictves():
"""
字典数据处理
:return:小王
"""
#实例化
dict=DictVectorizer(sparse=False)
#调用fit_transform
data=dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
print(data)
return None
if __name__ == '__main__':
dictves()
文本特征抽取:对文本数据进行特征值化
流程:
# 特征抽取
# 导入包
from sklearn.feature_extraction.text import CountVectorizer
def dictves():
"""
字典数据处理
:return:小王
"""
#实例化
dict=CountVectorizer()
#调用fit_transform
data=dict.fit_transform(["life is short,i like python","life is too long,i dislike python"])
print(data.toarray())#sprase矩阵转换成数组
print(dict.get_feature_names())
return None
if __name__ == '__main__':
dictves()
Jieba结巴分词:对三段话进行特征值化——流程
# 特征抽取# 导入包
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cutword():
c11=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
c21=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
c31=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
#转换成列表
content1 = list(c11)
content2 = list(c21)
content3 = list(c31)
#列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1,c2,c3
def hanzivec():
"""
中文特征值化
:return:小王
"""
#实例化
c1,c2,c3=cutword()
dict=CountVectorizer()
#调用fit_transform
data=dict.fit_transform([c1,c2,c3])
print(dict.get_feature_names())
print(data.toarray())#sprase矩阵转换成数组
return None
if __name__ == '__main__':
hanzivec()
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
# 特征抽取# 导入包
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
def cutword():
c11=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
c21=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
c31=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
#转换成列表
content1 = list(c11)
content2 = list(c21)
content3 = list(c31)
#列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1,c2,c3
def hanzivec():
"""
中文特征值化
:return:小王
"""
#实例化
c1,c2,c3=cutword()
dict=TfidfVectorizer()
#调用fit_transform
data=dict.fit_transform([c1,c2,c3])
print(dict.get_feature_names())
print(data.toarray())#sprase矩阵转换成数组
return None
if __name__ == '__main__':
hanzivec()
2.特征处理
2.1 归一化:传统精确小数据
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return: None
"""
mm = MinMaxScaler(feature_range=(2, 3))
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
return None
if __name__ == '__main__':
mm()
注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
2.2 标准化:大多数情况
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
3.数据降维
维度:特征的数量
3.1特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
from sklearn.feature_selection import VarianceThreshold
def seltz():
"""
特征选择
:return: None
"""
mm = VarianceThreshold()
data = mm.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
if __name__ == '__main__':
seltz()
3.2主成分分析PCA
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
from sklearn.decomposition import PCA
def pcaz():
"""
PCA
:return: None
"""
mm = PCA(n_components=0.94)
data = mm.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None
if __name__ == '__main__':
pcaz()
案例:超市订单分析
import pandas as pd
prior=pd.read_csv("F:\python\data\order_products__prior.csv")
products=pd.read_csv("F:\python\data\products.csv")
orders=pd.read_csv("F:\python\data\orders.csv")
aisles=pd.read_csv("F:\python/data/aisles.csv")
#合并四张表到一张表(用户——物品类别)
data1=pd.merge(prior,products,on=["product_id","product_id"])
data2=pd.merge(data1,orders,on=["order_id","order_id"])
data=pd.merge(data2,aisles,on=["aisle_id","aisle_id"])
#交叉表(特殊的分组工具)
cross=pd.crosstab(data["use_id"],data["aisles"])