案例:乳腺癌威斯康星州(原始)数据集

数据:http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Original%29
在这里插入图片描述
在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 读取数据
df = pd.read_csv(r'C:\Users\Administrator\Desktop\breast-cancer-wisconsin.csv')
df

在这里插入图片描述

## 通过 .columns 查看列名
df.columns

从df中随机抽取10行

sample1 = df.sample(n=10)
sample1
'''
          id  Clump Thickness  ...  Mitoses  Class
482  1318169                9  ...       10      4
645  1303489                3  ...        1      2
195  1212422                4  ...        1      2
489  1084139                6  ...        1      4
324   740492                1  ...        1      2
348   832226                3  ...        1      4
112  1172152               10  ...        3      4
124  1175937                5  ...        1      4
273   428903                7  ...        1      4
20   1054590                7  ...        4      4

[10 rows x 11 columns]
'''
df.shape
#去除重复值
df.drop_duplicates(inplace=True)
#恢复索引
df.index = range(df.shape[0])
df.shape#(691, 11)
df.info()

在这里插入图片描述

object_cols = df.select_dtypes(exclude = 'object').columns
print(object_cols )
# 缺失情况
df.isnull().sum()

在这里插入图片描述
读取数据并做简单的描述性统计 探索性分析,单变量分析,双变量分析 数据与处理和特征工程 建立模型并进行调参,选择最优参数 对测试数据进行预测,并保存模型结果

df.drop(['id'],axis=1,inplace=True)
df
df.describe(include = 'all').T

在这里插入图片描述

数据探索性分析

for i, item in enumerate(df):
    print('%s:%s'%(item,df[item].unique()))

在这里插入图片描述

Bare Nuclei列存在一个异常值

df['Bare Nuclei'].value_counts() # 有16个?

在这里插入图片描述

# df[df['Bare Nuclei'].isin('?')]
df[df['Bare Nuclei'] =='?']

在这里插入图片描述
异常值处理 如果发现了异常值,首先要观察,这个异常值出现的频率 如果异常值只出现了一次,多半是输入错误,直接把异常值删除 如果异常值出现了多次,去跟业务人员沟通,可能这是某种特殊表示,如果是人为造成的错误,异常值留着是没有用 的,只要数据量不是太大,都可以删除 如果异常值占到你总数据量的10%以上了,不能轻易删除。可以考虑把异常值替换成非异常但是非干扰的项,比如说用0 来进行替换,或者把异常当缺失值,用均值或者众数来进行替换

df['Bare Nuclei'].where(df['Bare Nuclei'] != '?',np.nan,inplace=True)

Where用来根据条件替换行或列中的值。如果满足条件,保持原来的值,不满足条件则替换为其他值。默认替换为NaN,也可以指定特殊值。

df['Bare Nuclei'][df['Bare Nuclei'] == '?'] = np.nan
df.head(30)

df.isnull().sum()

在这里插入图片描述

拉格朗日插值法—随机森林算法填充–KNN算法—sklearn填充(均值/众数/中位数)

缺失值填补,这里使用众数进行填补

众数

from scipy import stats
stats.mode(df['Bare Nuclei'])[0][0]

'1 ’

df['Bare Nuclei'].fillna(value=stats.mode(df['Bare Nuclei'])[0][0], inplace=True)
df.isnull().sum()

在这里插入图片描述

for i, item in enumerate(df):
    print('%s:%s'%(item,df[item].unique()))

在这里插入图片描述

df['Bare Nuclei'] = df['Bare Nuclei'].astype('int64')
df.info()

在这里插入图片描述

题外话:
刚开始我是用KNN插补,结果插补完出现浮点数,这明显不符合数据集的特点(1-10的整数)

在这里插入图片描述

对于KNN插补,可以用如下代码

from sklearn.impute import KNNImputer
impute = KNNImputer(n_neighbors = 2)
df_filled = impute.fit_transform(df)# df中有缺失值
df = pd.DataFrame(df_filled,columns=df.columns)

在这里插入图片描述


对数据的处理基本完成

数据可视化

sns.set_style("whitegrid") # 使用whitegrid主题
fig,axes=plt.subplots(nrows=5,ncols=2,figsize=(16,20))
for i, item in enumerate(df):
    plt.subplot(5,2,(i+1))
    #ax=df[item].value_counts().plot(kind = 'bar')
    ax=sns.countplot(item,data = df,palette="Pastel1")
    plt.xlabel(str(item),fontsize=14)   
    plt.ylabel('Count',fontsize=14)
    plt.xticks(fontsize=13)
    plt.yticks(fontsize=13)
    #plt.title("Churn by "+ str(item))
    i=i+1
    plt.tight_layout()
plt.show()

在这里插入图片描述
有轻微的样本不均衡问题

fig,axes=plt.subplots(nrows=5,ncols=2,figsize=(16,20))
for i, item in enumerate(df):
    if i!=9:
        plt.subplot(5,2,(i+1))
        ax=sns.countplot(x = item,hue = 'Class',data = df,palette="rainbow")
        plt.xlabel(str(item),fontsize=14)   
        plt.ylabel('Count',fontsize=14)
        plt.xticks(fontsize=13)
        plt.yticks(fontsize=13)
        plt.legend(loc='upper right',fontsize=13)
        #plt.title("Churn by "+ str(item))
        i=i+1
        plt.tight_layout()
plt.show()

在这里插入图片描述

plt.figure(figsize=(12,12))
sns.heatmap(df.corr(), center=0,
            square=True, linewidths=.5, cbar_kws={"shrink": .5},annot=True, fmt='.1f')
plt.tight_layout()

在这里插入图片描述

建模与模型评估

决策树

import pandas as pd
import graphviz
from sklearn import tree
from sklearn.model_selection import train_test_split

#将数据划分为标签和特征
X = df.drop(['Class'],axis = 1)
y = df['Class']
# 分训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3)

#恢复索引
for i in [Xtrain, Xtest, Ytrain, Ytest]:
    i.index = range(i.shape[0])

# 建立模型
clf = tree.DecisionTreeClassifier(criterion="entropy",
									random_state=30, # 设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显
									splitter="random" # 控制决策树中的随机选项
									)
# 训练
clf = clf.fit(Xtrain, Ytrain) 
#返回预测的准确度
score = clf.score(Xtest, Ytest) 
score  # 0.9519230769230769
feature_name = ['团块厚度','细胞大小的均匀性','细胞形状的均匀性','边缘附着力','单层上皮细胞大小','裸核','乏味染色质','正常核仁','线粒体']
dot_data = tree.export_graphviz(clf,out_file = None,
                                feature_names= feature_name,
                                class_names=["良性","恶性"],
                                filled=True,
                                rounded=True)

graph = graphviz.Source(dot_data)
graph

在这里插入图片描述
graphviz画图在这里有说:sklearn_决策树


特征重要性

[*zip(feature_name,clf.feature_importances_)]

[(‘团块厚度’, 0.07928484090157319),
(‘细胞大小的均匀性’, 0.006239695181160565),
(‘细胞形状的均匀性’, 0.6418075641411535),
(‘边缘附着力’, 0.025559378816469004),
(‘单层上皮细胞大小’, 0.012259788451959396),
(‘裸核’, 0.14909304212842098),
(‘乏味染色质’, 0.018736153376255508),
(‘正常核仁’, 0.06214238979422003),
(‘线粒体’, 0.004877147208787858)]


调参

默认参数

sklearn.tree.DecisionTreeClassifier(
criterion=’gini’, 
splitter=’best’, 
max_depth=None,
min_samples_split=2, 
min_samples_leaf=1, 
min_weight_fraction_leaf=0.0, 
max_features=None,
random_state=None, 
max_leaf_nodes=None, 
min_impurity_decrease=0.0, 
min_impurity_split=None,
class_weight=None, 
presort=False)

可以进行网格搜索

# 用GridSearchCV寻找最优参数(字典)
# 导入库
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
param = {'criterion':['gini','entropy'],'max_depth':[ int(x) for x in list(np.linspace(1,10,10)) ],'min_samples_leaf':[2,3,4,5,10],'min_impurity_decrease':[0.1,0.2,0.5]}
grid = GridSearchCV(DecisionTreeClassifier(),param_grid=param,cv=10)
grid.fit(Xtrain, Ytrain) 
print('最优分类器:',grid.best_params_,'最优分数:', grid.best_score_)  # 得到最优的参数和分值

最优分类器: {‘criterion’: ‘gini’, ‘max_depth’: 1, ‘min_impurity_decrease’: 0.1, ‘min_samples_leaf’: 2} 最优分数: 0.9088860544217686

我做出来 效果不ok

  • max_depth

#限制树的最大深度,超过设定深度的树枝全部剪掉
import matplotlib.pyplot as plt
test = []
for i in range(20):
    clf = tree.DecisionTreeClassifier(max_depth=i+1
            ,criterion="entropy"
            ,random_state=30
            ,splitter="random")
    
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)
    test.append(score)
plt.plot(range(1,21),test,color="red",label="max_depth")
plt.legend()
plt.show()


print(max(test))
print(test.index(max(test))+1)
# 在 max_depth=6 时,得分最高

在这里插入图片描述

clf = tree.DecisionTreeClassifier(max_depth=6
        ,criterion="entropy"
        ,random_state=30
        ,splitter="random")

clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score

0.9711538461538461

tr = []
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=25,max_depth=i+1,criterion="entropy")
    clf = clf.fit(Xtrain, Ytrain)
    score_tr = clf.score(Xtrain,Ytrain)
    score_te = cross_val_score(clf,X,y,cv=10).mean()
    tr.append(score_tr)
    te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()

在这里插入图片描述

明显的过拟合

  • min_samples_leaf
    限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(min_samples_leaf=i+1
            ,criterion="entropy"
            ,max_depth=6
            ,random_state=30
            ,splitter="random")
    
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)
    test.append(score)
plt.plot(range(1,11),test,color="blue",label="min_samples_leaf")
plt.legend()
plt.show()

在这里插入图片描述

clf = tree.DecisionTreeClassifier(max_depth=6
        ,criterion="entropy"
        ,random_state=30
        ,splitter="random",min_samples_leaf=4)

clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score

0.9759615384615384

  • min_samples_split
    限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
test = []
for i in range(9):
    clf = tree.DecisionTreeClassifier(min_samples_split=i+2
            ,criterion="entropy"
            ,max_depth=6
            ,random_state=30
            ,splitter="random",min_samples_leaf=4)
    
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)
    test.append(score)
plt.plot(range(2,11),test,color="red",label="min_samples_split")
plt.legend()
plt.show()

在这里插入图片描述

clf = tree.DecisionTreeClassifier(max_depth=6
        ,criterion="entropy"
        ,random_state=30
        ,splitter="random",min_samples_leaf=4,min_samples_split=2)

clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score

0.9759615384615384

y_predict=clf.predict(Xtest)# 预测
y_predict

在这里插入图片描述

# 依然使用sklearn.metrics里面的classification_report模块对预测结果做更加详细的分析。
from sklearn.metrics import classification_report
print (classification_report(Ytest, y_predict))

在这里插入图片描述

支持向量机

from sklearn.svm import SVC
clf = SVC(kernel = "rbf"
              ,gamma="auto"
              ,degree = 1
              ,cache_size = 5000
             ).fit(Xtrain, Ytrain)
result = clf.predict(Xtest)
score = clf.score(Xtest,Ytest) # 返回准确度
score

0.9615384615384616

随机森林

sklearn.ensemble.RandomForestClassifier ( n_estimators=’10’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(random_state=0) # 随机森林实例化
# 训练
rfc = rfc.fit(Xtrain,Ytrain)
# 得分
score_Random_Forest = rfc.score(Xtest,Ytest)
print(score_Random_Forest)

0.9903846153846154

# 随机森林交叉验证
from sklearn.model_selection import cross_val_score
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,X,y,cv=10)
plt.plot(range(1,11),rfc_s,label = "RandomForest")
plt.show()

在这里插入图片描述

决策树 随机森林对比

clf = DecisionTreeClassifier(random_state=0) # 决策树实例化
rfc = RandomForestClassifier(random_state=0) # 随机森林实例化

# 训练
clf = clf.fit(Xtrain,Ytrain) 
rfc = rfc.fit(Xtrain,Ytrain)

# 得分
score_Single_Tree = clf.score(Xtest,Ytest)
score_Random_Forest = rfc.score(Xtest,Ytest)

print(score_Single_Tree,score_Random_Forest)

n_estimators的学习曲线

superpa = []
for i in range(50):
	rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1)
	rfc_s = cross_val_score(rfc,X,y,cv=10).mean()
	superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa)))
plt.figure(figsize=[20,5])
plt.plot(range(1,51),superpa)
plt.show()

XGBoot

from xgboost import XGBClassifier as XGBC
from sklearn.metrics import confusion_matrix as cm, recall_score as recall, roc_auc_score as auc
# 分类模型
clf = XGBC().fit(Xtrain,Ytrain)
ypred = clf.predict(Xtest)
ypred

在这里插入图片描述

# 准确率  
clf.score(Xtest,Ytest)  0.9711538461538461
cm(Ytest,ypred,labels=[2,4]) # 混淆举证 少数类写在前面
# 2 有133个少数类被分正确,4个分错误
# 0 有69个多数类被分正确,2个错误


array([[133,   4],
       [  2,  69]], dtype=int64)

还可以做更多分析…

  • 47
    点赞
  • 335
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
好的,我来回答你的问题。 首先,关于您提到的ChitGPT,我了解到它是一个基于GPT-2模型的中文聊天机器人,可以用来回答用户的问题和进行对话。它与OpenAI公司的ChatGPT确实没有直接关系,但是它们都是基于GPT模型的聊天机器人。 接下来,回到您的问题。关于乳腺癌威斯康星州数据集的分类问题,我们可以使用scikit-learn中的SVM分类器来解决。具体步骤如下: 1. 导入数据集 我们可以使用以下代码来导入数据集: ```python from sklearn.datasets import load_breast_cancer data = load_breast_cancer() ``` 通过以下代码可以查看数据集的信息: ```python print("数据量:", data.data.shape[0]) print("维度:", data.data.shape[1]) print("特征类型:", set([type(x) for x in data.data[0]])) print("特征名:", data.feature_names) print("标签名:", data.target_names) print("标签分布情况:", [(data.target_names[i], list(data.target).count(i)) for i in range(len(data.target_names))]) print("数据集描述:", data.DESCR) ``` 2. 建模 我们可以使用四种核函数,包括`linear`、`poly`、`rbf`和`sigmoid`,对数据集进行分类。具体代码如下: ```python from sklearn.svm import SVC from sklearn.model_selection import train_test_split X = data.data y = data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 定义SVM分类器 svm_linear = SVC(kernel='linear') svm_poly = SVC(kernel='poly') svm_rbf = SVC(kernel='rbf') svm_sigmoid = SVC(kernel='sigmoid') # 训练模型 svm_linear.fit(X_train, y_train) svm_poly.fit(X_train, y_train) svm_rbf.fit(X_train, y_train) svm_sigmoid.fit(X_train, y_train) ``` 3. 模型评价 最后,我们可以使用以下代码来评估每种核函数下的分类准确率和计算时间: ```python from sklearn.metrics import accuracy_score import time # 预测测试集 y_pred_linear = svm_linear.predict(X_test) y_pred_poly = svm_poly.predict(X_test) y_pred_rbf = svm_rbf.predict(X_test) y_pred_sigmoid = svm_sigmoid.predict(X_test) # 计算准确率 acc_linear = accuracy_score(y_test, y_pred_linear) acc_poly = accuracy_score(y_test, y_pred_poly) acc_rbf = accuracy_score(y_test, y_pred_rbf) acc_sigmoid = accuracy_score(y_test, y_pred_sigmoid) # 计算时间 start_time = time.time() svm_linear.predict(X_test) time_linear = time.time() - start_time start_time = time.time() svm_poly.predict(X_test) time_poly = time.time() - start_time start_time = time.time() svm_rbf.predict(X_test) time_rbf = time.time() - start_time start_time = time.time() svm_sigmoid.predict(X_test) time_sigmoid = time.time() - start_time # 输出结果 print("linear kernel: accuracy=%.2f%%, time=%.4fs" % (acc_linear*100, time_linear)) print("poly kernel: accuracy=%.2f%%, time=%.4fs" % (acc_poly*100, time_poly)) print("rbf kernel: accuracy=%.2f%%, time=%.4fs" % (acc_rbf*100, time_rbf)) print("sigmoid kernel: accuracy=%.2f%%, time=%.4fs" % (acc_sigmoid*100, time_sigmoid)) ``` 这样就完成了乳腺癌威斯康星州数据集的分类任务,同时我们也了解了如何使用SVM分类器进行分类和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值