GIL
全称Global Interpreter Lock, 保证了了同一时刻只有一个线程在一个CPU上执行字节码,无法将多个线程映射到多个CPU上
numpy:释放了GIL
数据集:
scikit-learn: 数据量小,方便学习
UCI:收录了360个数据集,覆盖科学,生活,经济等领域,数据量几十万
Kaggle:大数据竞赛平台,真实数据,数据量巨大
特征值+目标值
feature is called "特征“
目标值:e.g. 男/女
特征工程:将原始数据转换为更好地代表预测模型的潜在问题的特征,提供数据预测的准确性
特征抽取:
字典特征抽取:数值化。把字典中一些类别数据,分别转换成特征。
数组形式的数据,有类别的特征先转成字典数据。
sklear.feature_extraction.DictVectorizer
返回值为Sparse Matrix
def dict_vec():
dictvect=sklearn.feature_extraction.DictVectorizer()
list=[{"city":"Beijing","temp":100},
{"city":"London","temp":60},
{"city":"Shanghai","temp":30}]
arr=dictvect.fit_transform(list)
return arr
Sparse Matrix:
(0, 0) 1.0
(0, 3) 100.0
(1, 1) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
返回值为ndarray
dictvect=sklearn.feature_extraction.DictVectorizer(sparse=False)
[[ 1. 0. 0. 100.]
[ 0. 1. 0. 60.]
[ 0. 0. 1. 30.]]
One-hot 编码
为每个类别生产一个布尔列,这些列中只有一列可以为每个样本取值1。
文本特征抽取
sklearn.feature_extraction.text.CountVectorizer
返回词频矩阵
1.统计所有文章当中所有的词,重复的只看作一次。
2.对每篇文章,在词的列表里面进行统计,统计出每个词出现的个数
text=cv.fit_transform("life is hard, I want to go out and go back London")
fit_transform(需要是Iterable type),改成 list 后不报错
def count_words():
cv=CountVectorizer()
text=cv.fit_transform(["life is hard, I want to go out and go back London"])
print(cv.get_feature_names())
print(text.toarray())
['and', 'back', 'go', 'hard', 'is', 'life', 'london', 'out', 'to', 'want']
[[1 1 2 1 1 1 1 1 1 1]]
中文文本需要另外分词:jieba分词器
直接pip install jieba 会报错,
需要用国内的镜像:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
def Chinese_txt():
#分词
con1=jieba.cut("金融是货币资金融通的总称主要指与货币流通和银行信用相关的各种活动")
con2=jieba.cut("主要内容包括货币的发行投放流通和回笼各种存款的吸收和提取各项贷款的发放和收回")
con3=jieba.cut("信用与货币流通这两个经济过程已紧密地结合在一起最能表明金融特征的是可以创造和消减货币的银行信用")
print(con1)
#字符串转换成列表
list1=list(con1)
list2=list(con2)
list3=list(con3)
print(list1)
#列表返回成字符串
return c1,c2,c3
print(con1)# 直接打印出来的不是结果,需要转换成list
print(list1)
<generator object Tokenizer.cut at 0x0000026CEB43D848>
['金融', '是', '货币资金', '融通', '的', '总称', '主要', '指', '与', '货币流通', '和', '银行信用', '相关', '的', '各种', '活动']
先将中文文本进行分词处理,jieba会提供合适的分词形式。
def Chinese_txt_split():
#分词
con1=jieba.cut("金融是货币资金融通的总称主要指与货币流通和银行信用相关的各种活动")
con2=jieba.cut("主要内容包括货币的发行投放流通和回笼各种存款的吸收和提取各项贷款的发放和收回")
con3=jieba.cut("信用与货币流通这两个经济过程已紧密地结合在一起最能表明金融特征的是可以创造和消减货币的银行信用")
print(con1)
#字符串转换成列表
list1=list(con1)
list2=list(con2)
list3=list(con3)
print(list1)
#列表返回成以空格隔开的字符串
c1=" ".join(list1)
c2=" ".join(list2)
c3=" ".join(list3)
return c1,c2,c3
然后再统计词频数量
def count_words():
c1,c2,c3=Chinese_txt_split()
cv=CountVectorizer()
text=cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(text.toarray())
if __name__ == '__main__':
count_words()
['一起', '两个', '主要', '信用', '内容', '创造', '包括', '发放', '发行', '可以', '各种', '各项', '吸收', '回笼', '存款', '总称', '投放', '提取', '收回', '最能', '活动', '流通', '消减', '特征', '相关', '紧密', '经济', '结合', '融通', '表明', '货币', '货币流通', '货币资金', '贷款', '过程', '金融', '银行信用']
[[0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1]
[0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0]
[1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1]]
Tf-idf:
term frequency
inverse document frequency:
log(总文档数量/该词出现的文档数量)
如果某个词语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词具有很好的类别区分能力,适合用来分类。
tf * idf 重要性程度: 词频 * 逆文档频率
sklearn.feature_extraction.text.TfidfVectorizer
def tfidfvec():
c1,c2,c3=Chinese_txt_split()
tf=TfidfVectorizer()
text=tf.fit_transform([c1,c2,c3])
print(tf.get_feature_names())
print(text.toarray())
特征预处理
数值型数据:
1.归一化
2. 标准化
3. 缺失值
类别型数据: one-hot编码
时间类型:时间的区分
sklearn.preprocessing
归一化(Normalisation) 公式:
x’ = (x - X_min) / (X_max - X_min)
x’’=x’ * (X_max - X_min) + X_min
sklearn.preprocessing.MinMaxScaler
有些特征同等重要,但是值的大小不在一个数量级上,需要进行归一化,避免有些数值过小而被忽略不计。
缺点:如果出现异常点,会对结果产生较大影响(由于最大值和最小值发生了改变),所以这种方法鲁棒性(反应了产品的稳定性)较差。
标准化(Standardization)
通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内。
x’ = (x - μ ) / σ
μ is mean, σ is variance
sklearn.preprocessing.StandarScaler
def standar():
std=StandardScaler()
data=std.fit_transform([[-1,-3,4],
[-4,2,6],
[3,-2,1]])
print(data)
[[-0.11624764 -0.9258201 0.16222142]
[-1.16247639 1.38873015 1.13554995]
[ 1.27872403 -0.46291005 -1.29777137]]
缺失值处理方法
-
删除
-
插补
Imputer ( missing_values='NaN',strategy='mean',axis=0)
数据降维:
特征选择:
-
Filter: Variance Threshold
-
Embedded: 正则化,决策树
-
Wrapper
-
neural network
sklearn.feature_selection.VarianceThreshold
PCA
特征数量达到上百的时候,要考虑数据的简化。
目的:是数据维数的压缩,尽可能降低原数据的维度(复杂度),损失少量信息。
作用: 可以削减回归分析或者聚类分析中特征的数量。
(有一些具有相关性的数据可以进行化简)
参数 n_components: (Number of components)
range 0-1, usually use 90~95% ( 保存了90-95%的信息量)
sklearn.decomposition.PCA
交叉表 (特殊的分组表)
pd.crosstab (mt['usr_id'],mt['product_id'])
可以用来统计每个客户每种商品的购买次数
数据类型:
离散型数据:全部都是整数而且不可以再细分。
连续型数据:变量的取值可以是连续的,如,长度,时间,质量值等,通常是非整数。
监督学习
分类 (离散型数据): k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
回归 (连续型数据): 线性回归、岭回归
标注 隐马尔可夫模型 (不做要求)
无监督学习
聚类 :k-means
转换器 :fit_transformer中的Transformer,用于特征工程
估计器:分类器和回归器都属于estimator,是一类实现了算法的API。