一,机器学习是从数据中自动分析获得规律,并利用规律对未知数据进行预测的方法。
二,机器学习中数据集的构成是:csv文件,而不是数据库。因为数据库的读取速度有限制并且格式不符合。数据构成:特征值+目标值(有的数据集可以没有目标值)。
三,特征工程
作用:对特征进行处理,将原始数据转换为更好地代表预测模型地潜在问题地特征,从而提高预测效果。
1, 特征抽取:对文本等数据进行特征值化
sklearn特征抽取API:sklearn.feature_extraction
(1) 字典特征抽取
我们将城市和环境作为字典数据,来进行特征的提取。
sklearn.feature_extraction.DictVectorizer(sparse = True)
将映射列表转换为Numpy数组或scipy.sparse矩阵
sparse 是否转换为scipy.sparse矩阵表示,默认开启
方法:
fit_transform(X,y)
应用并转化映射列表X,y为目标类型
inverse_transform(X[, dict_type])
将Numpy数组或scipy.sparse矩阵转换为映射列表
代码如下:
from sklearn.feature_extraction import DictVectorizer
onehot=DictVectorizer(sparse=False)#需要先生成实例对象,如果为True则返回sparse数组,需要用toarray转化
instances=[{'city':'北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
x=onehot.fit_transform(instances)#才能调用方法
print(x)
print(onehot.inverse_transform(x,dict_type=dict))
print(onehot.feature_names_)
结果如下:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
['city=上海', 'city=北京', 'city=深圳', 'temperature']
作用主要是进行分类。
(2)文本特征抽取(英文)
from sklearn.feature_extraction.text import CountVectorizer
cv=CountVectorizer()#无法传入参数
content = ["life is short,i like python","life is too long,i dislike python"]
print(cv.fit_transform(content).toarray())
print(cv.get_feature_names())
#单个字母不参与特征抽取
结果如下:
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
注:该方法本质是求各特征的出现次数,所以可以出现两次,多次的情况。本例为特殊。
(3)文本特征抽取(中文)
依然可用sklearn.feature_extraction.text.CountVectorizer作为API但是需要先对中文进行分词,与英文相同,用空格隔开,这里用jieba模块自动进行分词.
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def ZW(contents):
cv=CountVectorizer()#无法传入参数
a=[]
for i in contents:
a.append(jb(i))
print(a)
print(cv.fit_transform(a).toarray())
print(cv.get_feature_names())
#单个字母不参与特征抽取
def jb(content):
x=jieba.cut(content)#这里返回的是词语迭代器
li=list(x)
jb=' '.join(li)
return jb
if __name__=='__main__':
a=['张梦是个紫的猪','张梦是个红的猪','张梦是个能吃的猪']
ZW(a)
结果如下:
['张梦是 个 紫 的 猪', '张梦是 个 红 的 猪', '张梦是 个 能 吃 的 猪']
[[1]
[1]
[1]]
['张梦是']
因为单个字不作为特征
(4)特征抽取中文(tf-df方法)
为什么要用这个方法?因为如果某个词或短语在一篇文章中出现概率很高,在其他文章很少出现,那么就认为该词适合分类。如’明天‘,’今天‘等词就不适合分类。
将上面的count改为Tfidf即可
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def ZW(contents):
cv=CountVectorizer()#无法传入参数
a=[]
for i in contents:
a.append(jb(i))
print(a)
print(cv.fit_transform(a).toarray())
print(cv.get_feature_names())
#单个字母不参与特征抽取
def jb(content):
x=jieba.cut(content)#这里返回的是词语迭代器
li=list(x)
jb=' '.join(li)
return jb
def TF(contents):
cv=TfidfVectorizer()#无法传入参数
a=[]
for i in contents:
a.append(jb(i))
print(a)
print(cv.fit_transform(a).toarray())
print(cv.get_feature_names())
if __name__=='__main__':
a=['为什么要用这个方法?因为如果某个词或短语在一篇文章中出现概率很高,','在其他文章很少出现,那么就认为该词适合分类。','如’明天‘,’今天‘等词就不适合分类']
TF(a)
结果如下:
['为什么 要 用 这个 方法 ? 因为 如果 某个 词 或 短语 在 一篇 文章 中 出现 概率 很 高 ,', '在 其他 文章 很少 出现 , 那么 就 认为 该词 适合 分类 。', '如 ’ 明天 ‘ , ’ 今天 ‘ 等 词 就 不 适合 分类']
[[0.31377734 0.31377734 0. 0. 0.23863575 0.
0.31377734 0.31377734 0. 0.23863575 0.31377734 0.
0.31377734 0.31377734 0.31377734 0. 0. 0.31377734
0. 0. ]
[0. 0. 0. 0.36977238 0.28122142 0.28122142
0. 0. 0.36977238 0.28122142 0. 0.
0. 0. 0. 0.36977238 0.36977238 0.
0.28122142 0.36977238]
[0. 0. 0.5628291 0. 0. 0.42804604
0. 0. 0. 0. 0. 0.5628291
0. 0. 0. 0. 0. 0.
0.42804604 0. ]]
['一篇', '为什么', '今天', '其他', '出现', '分类', '因为', '如果', '很少', '文章', '方法', '明天', '某个', '概率', '短语', '认为', '该词', '这个', '适合', '那么']
Loading model cost 0.769 seconds.
会显示重要度
(5)图像抽取
2,特征预处理
对数据进行处理,转化为算法要求的数据。
特征处理API:sklearn.preprocessing
对数值进行预处理方法有(1)归一化(2)标准化(3)缺失值处理
对类别初始化:one_hot编码
对时间初始化:时间切分
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler,StandardScaler,Imputer
import jieba
import numpy as np
a=np.array([[1,2,3],
[-4,-5,-6],
[7,-8,9]])
mm=MinMaxScaler(feature_range=(2,3))#指定范围
x=mm.fit_transform(a)
print(x)
[[2.45454545 3. 2.6 ]
[2. 2.3 2. ]
[3. 2. 3. ]]
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler,StandardScaler,Imputer
import jieba
import numpy as np
a=np.array([[1,2,3],
[-4,-5,-6],
[7,-8,9]])
mm=MinMaxScaler(feature_range=(2,3))#指定范围
st=StandardScaler()
x=st.fit_transform(a)
print(x)
print(st.mean_)
[[-0.07412493 1.35244738 0.16222142]
[-1.18599891 -0.31822291 -1.29777137]
[ 1.26012384 -1.03422447 1.13554995]]
[ 1.33333333 -3.66666667 2. ]
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler,StandardScaler,Imputer
import jieba
import numpy as np
im=Imputer(missing_values='NaN',strategy='mean',axis=0)
x=im.fit_transform([[1,2],
[np.NaN,-5],
[7,-8]])
print(x)
import numpy as np
from sklearn.impute import SimpleImputer
a = [[1, 2],
[np.nan, -5],
[7, -8]]
im = SimpleImputer(missing_values=np.nan, strategy='mean')
x = im.fit_transform(a)
print(x)#可正常运行
结果如下:
[[ 1. 2.]
C:\anaconda\lib\site-packages\sklearn\utils\deprecation.py:66: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.
[ 4. -5.]
[ 7. -8.]]
warnings.warn(msg, category=DeprecationWarning)
警告是版本问题。