import pandas as pd
data = pd.read_csv("chanllenge.csv") #读取文件
cols = list(data.columns) #获取字段名称(列名)
col_num = len(cols) #获取字段数量(列数)
sam_num = data.shape[0] #获取样本数量
five_data = data.head() #获取样本前五行
讲一下sam_num = data.shape[0]
和five_data = data.head()
这两句:
five_data = data.head(n = 10)
就是获取样本前十行。import numpy as np
from scipy.stats import stats
test_data = np.random.random(size = 100)
model = stats.kstest(test_data,'norm') #正太检验
讲一下scipy
库、kstest()
函数和np.random
模块:
model = stats.kstest(test_data,'norm')
中kstest这里有两个参数,一个就是我们的数据(样本),另外一个是我们要看数据是否符合的分布。norm表示标准正态分布,还有其他不作介绍了。kstest还有其他参数也不多做介绍。import pandas as pd
example_data = pd.Series([1,2,3,np.nan,4])
boolean_array = pd.isnull(example_data)
new_data = example_data.fillna('missing')
new_data = data.fillna(data.mean())
Min-Max标准化的数学公式:
f i ′ = f i − f m i n f m a x − f m i n f'_i=\frac{f_i - f_{min}}{f_{max}-f_{min}} fi′=fmax−fminfi−fmin
其中 f i f_i fi为原数据, f i ′ f'_i fi′为标准化后的数据,另外两个分别是数据的最大值和最小值。
import pandas as pd
data = pd.readd_csv('birthrate.csv')
dmax = max(data.birth_rates) #最大值
dmin = min(data.birth_rates) #最小值
minmax_scaling_data = (data.birth_rates - dmin)/(dmax-dmin) #Min-Max标准化
import pandas as pd
data = pd.readd_csv('birthrate.csv')
data_qcut = pd.qcut(data['birth_rates'], 4) #等频离散化
讲一下等频离散化和qcut()
函数:
['ID','CT','FA','WT','SP']
,对其不是ID列的列进行z-score标准化Min-Max标准化的数学公式:
f i ′ = f i − μ σ f'_i = \frac{fi - \mu}{\sigma} fi′=σfi−μ
其中 μ \mu μ和 σ \sigma σ分别为 f f f的均值和标准差
import pandas as pd
new_columns = ['CT','FA','WT','SP']
data[new_columns] = data[new_columns].apply(lambda x : ((x - x.mean())/x.srd()) #z-score标准化
下面对apply()
进行一些说明:
cnt
df_trainx
与df_trainy
,剩下的30%的数据进行回归结果测试df_testx
predict_value
from sklearn .linear_model import LinearRegression
model = LinearRegression().fit(df_trainx,df_trainy) #训练模型
predict_value = model.predict(df_testx) #用训练出来的模型进行预测
df_trainx
和df_trainy
,用剩余样本进行回归结果测试df_testx
predict_value
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(df_trainx, df_trainy) #训练模型
predict_value = model.predict(df_testx) #用训练出来的模型进行预测
一些说明:原章节这里的线性规划并不需要到正则化所以这里的代码并没有正则化。
predict_value
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier().fit(df_trainx,df_trainy) #训练模型
predict_value = model.predict(df_testx) #用训练出来的模型进行预测
df_trainx
和df_trainy
,用剩余样本进行分类结果测试df_testx
。predict_value
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier().fit(df_trainx,df_trainy) #训练模型
predict_value = model.predict(df_testx) #用训练出来的模型进行预测
prob_win_0 = 0.65
prob_win_1_home_1 = 0.75
prob_win_0_home_1 = 0.3
prob_home_0_win_1
,小数点保留三位。## 计算队1获胜的概率prob_win_1
prob_win_1 = 1 - prob_win_0
## 计算队1取胜时队0是东道主的概率
prob_win_1_home_0 = 1 - prob_win_1_home_1
## 计算队0取胜时队0是东道主的概率
prob_win_0_home_0 = 1 - prob_win_0_home_1
## 计算队0是东道主的概率
prob_home_0 = prob_win_1_home_0*prob_win_1 + prob_win_0_home_0*prob_win_0
## 队1在客场取胜的概率
prob_home_0_win_1 = prob_win_0_home_1*(1-prob_home_0)/prob_win_0
df_trainx
和df_trainy
,用剩余样本进行分类结果测试df_testx
。predict_value
以及预测标签为1的概率predict_prob
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier().fit(df_trainx, df_trainy) #训练模型
predict_value = model.predict(df_testx) #用训练出来的模型进行预测
predict_prob = model.predict_proba(df_testx)[:, 1]
from sklearn.cluster import KMeans
a = df_trainx[df_trainx.isnull().values==True].drop_duplicates() #将空值单独取出来放在一个新的DataFrame对象a里面
print(a.shape[0]) #输出a的形状的行(原df_trainx多少行有空值)
df_trainx = df_trainx.fillna(df_trainx.mean()) #均值填充缺失值
model = KMeans(n_clusters=3).fit(df_trainx) #训练模型
predict_value = model.labels_ #输出模型结果
讲一下.drop_duplicates()
这个后缀:
如果没有这个后缀,像这样df_trainx[df_trainx.isnull().values==True]
那么如果某一行有多个空值,a则会有多个记录,加了后缀相当于一个去重的效果。
df_trainx
,根据选择的模型给出预测结果predict_value
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3).fit(df_trainx) #训练模型
predict_value = model.labels_ #输出模型结果
df_trainx
根据选择的模型给出预测结果predict_value
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import PCA
import jieba
# 分词及对文本向量化表示
list_text = [' '.join(word for word in jieba.cut(line) if word != ' ') for line in df_trainx.ix[:, 0]]
tfidf = TfidfVectorizer(max_df=0.95, stop_words=stopwords).fit(list_text)
array_trainx = tfidf.transform(list_text).toarray()
# PCA降维
pca = PCA()
pca.fit(array_trainx)
n_component = 0
while sum(pca.explained_variance_ratio_[0: n_component]) < 0.9:
n_component += 1
pca = PCA(n_components=n_component)
array_trainx = pca.fit_transform(array_trainx)
# 训练模型
model = KMeans(n_clusters=2).fit(array_trainx)
# 输出预测结果
predict_value = model.labels_
第一次看到这串代码肯定一脸懵逼,下面对代码说明:
list_text = [' '.join(word for word in jieba.cut(line) if word != ' ') for line in df_trainx.ix[:, 0]]
这个嵌套应用了列表表达式,比较高级。
先看最后的for line in df_trainx.ix[:, 0]]
,表示对于df_trainx中第一列的每个元素暂时符给line,然后line在前面list_text = [' '.join(word for word in jieba.cut(line) if word != ' ')
这一段里面操作。
然后看这个word for word in jieba.cut(line)
,表示对line进行分词后的每个元素复制给word,然后对word进行操作。
这里又要插一下关于jieba.cut()的说明了。jieba是一个对文本进行拆分(分词)的模块,这个模块支持中文文本。cut是里面的函数。cut()有两个传入参数,第一个就是要拆分的字符串,就是这里的line,第二个参数是拆分的不同模式,不具体介绍。
由if word != ' '
限制了line中的空字符不要赋值给word。然后把每个word加入到(join()函数)最前面那个空字符里面去。说白了就是line不要’'空字符。
总体就是df_trainx.ix[:, 0]]
这一列的元素不要空字符形成一个名字叫list_text
的列表对象。
tfidf = TfidfVectorizer(max_df=0.95, stop_words=stopwords).fit(list_text)
首先看TfidfVectorizer是from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import PCA
这句代码从sklearn库里面导入进来的。(我的理解,我也没有太研究深入)简单解释其实它是一个模型的模板,统计list_text列表中每个元素(词)的频率,然后构建出了具体的模型名字叫tfidf
3.array_trainx = tfidf.transform(list_text).toarray()
这个相当于把tfidf模型的一个numpy数组(ndarray对象)赋值给array_trainx,大概就是toarray()的意思吧。然后这个数组表示的是什么呢?(任然是我根据输出大致看出来的,没有深入研究,希望有大佬能指正),数组的元素是1和0,每一行是一个样本。然后列表示原来特征的值,行的样本的特征值本来是哪个,它就在哪个列1,其他列全0。比如说数据示例里面的style特征(注意示例中的Drees_ID这一特征我在应用的时候删除了所以df_trainx的第一列就是style),第一个样本是sexy,那么第一行,sexy的那一列是1。第二个样本是casual,那么第二行,casual的列是1。
就相当于一个矩阵,统计列的和,就可以知道频率了。
具体说一下while sum(pca.explained_variance_ratio_[0: n_component]) < 0.9: n_component += 1
一开始pca.fit(array_trainx)
就相当于array_trainx是500样本,每个样本为12维(12个style)
while循环中explained_variance_ratio_返回保留的方差百分比,设阈值为90%。从第一个维(特征)的方差百分比开始算起,一直累计求和,直到≥阈值0.9说明到了我们想要的降维位数n_component(<12),下面再用pca = PCA(n_components=n_component)
换成新的维为降维后的n_component。最后array_trainx = pca.fit_transform(array_trainx)
把新的维替换掉原来的维