<jupyter_start><jupyter_text>سوال پنجم<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random<jupyter_output><empty_output><jupyter_text>a)<jupyter_code>missing_values = ["NA","?"]
df = pd.read_csv('thyroid.csv',na_values=missing_values)
df.head()
df = pd.DataFrame(df[pd.notnull(df['Outcome'])])
df.head()
df.replace(np.NaN,df.mean(),inplace=True)
df.head()<jupyter_output><empty_output><jupyter_text>شرح کد : ابتدا سایر علائمی که علاوه بر مقادیر استاندارد بجای null استفاده شده اند را تاثیر دادیم و فایل را خواندیم. سپس رکورد هایی را که متغیر تارگت آنها یعنی Outcome  نال بود حذف کردیم و سپس در سایر ستون ها بجای مقادیر null میانگین آن ستون را قرار دادیم  b)<jupyter_code>import seaborn as sns
corrMatrix = df.corr()
corrMatrix
sns.heatmap(corrMatrix, annot=True)<jupyter_output><empty_output><jupyter_text>شرح کد : ایتدا ماتریس ضزایب همبستگی را ایجاد کرده و سپس heatmap آن را رسم کردیم. هرچه اعداد به +-1 نزدیک تر باشند همبستگی بیشتر است  c)<jupyter_code>c = df.groupby('Outcome')['Outcome'].count()
c
print("Current Percentage of two/total:",(30/174)*100)
print("#Records Needed to Resample To Achieve 50% two/total: " , ((0.5*174)-30)/0.5) #x = (p(rare)-current)/1-p
to_resample = df.loc[df['Outcome'] == 2]
our_resample = to_resample.sample(n = 114, replace = True)
balanced_df = pd.concat([df, our_resample])
print(balanced_df.groupby('Outcome')['Outcome'].count())
print("Current Percentage of 2:",(144/(144+144))*100)<jupyter_output>Outcome
1.0    144
2.0    144
Name: Outcome, dtype: int64
Current Percentage of 2: 50.0<jupyter_text>شرح کد : در بخش اول دیدیم نسبت رکوردها با کلاس هدف 2 نسبت به کلاس 1به نسبت کمتر است و داده ها  می توانند imbalanced تلقی شوند و در کل کلاس 2،  17 درصد کل را تشکیل داده است.برای رساندن این درصد به 50% به 114 رکورد نیاز داریم. در بخش بعد داده های با کلاس 2 را که می خواهیم سمپل کنیم در to_resample ذخیره می کنیم . 114 تای دیگر مشابه آنها تواید و با دیتاست اصلی concat می کنیم. حال درصد هریک از کلاس ها به 50 رسیده است  d)<jupyter_code>from sklearn.model_selection import train_test_split
X = balanced_df.drop('Outcome', axis=1)
y = balanced_df['Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)<jupyter_output><empty_output><jupyter_text>شرح کد : ابتدا X وy را جدا کرده و سپس X و y های آموزش و تست را با اندازه تست 0.2 می سازیم.  e)<jupyter_code>from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
cart00 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6).fit(X_train,y_train)
print(X_train.columns)
fig, axes = plt.subplots(1,1,figsize=(12,12))
tree.plot_tree(cart00,ax=axes)<jupyter_output>Index(['T3_resin', 'Serum_thyroxin', 'Serum_triiodothyronine', 'Basal_TSH',
       'Abs_diff_TSH'],
      dtype='object')<jupyter_text>شرح کد : به کمک کتابخانه sklearn یک DecisionTreeClassifier با پارامتر gini ساختیم و با داده های x و y آموزشی آن را train کردیم و درخت ان را پلات کردیم.  f)<jupyter_code>from sklearn.metrics import classification_report, confusion_matrix
 y_predicted = cart00.predict(X_test)
# cart01.score(y_predicted,y_test)

print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted))<jupyter_output>[+] confusion matrix

[[29  1]
 [ 0 28]]

[+] classification report

              precision    recall  f1-score   support

         1.0       1.00      0.97      0.98        30
         2.0       0.97      1.00      0.98        28

    accuracy                           0.98        58
   macro avg       0.98      0.98      0.98        58
weighted avg       0.98      0.98      0.98        58<jupyter_text>شرح کد : X_test را به مدلcart00 که آموزش دادیم دادیم تا y آن را پیشبینی کند و آنها را در y_predicted ذخیره کردیم.برای سنجش دقت confusion matrix را نمایش دادیم که بیانگر این است که در کل روی 58 داده تست شده است مدل و 1 نمونه به خطا ب بقیه صحیح پیش بینی شده اند و به دقت 98% رسیده ایم.  g)<jupyter_code>#max_depth = 1

cart01 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=1).fit(X_train,y_train)
y_predicted01 = cart01.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted01))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted01))
#max_depth = 2

cart02 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=2).fit(X_train,y_train)
y_predicted02 = cart02.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted02))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted02))
#max_depth = 3

cart03 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=3).fit(X_train,y_train)
y_predicted03 = cart03.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted03))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted03))
#max_depth = 4

cart04 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=4).fit(X_train,y_train)
y_predicted04 = cart04.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted04))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted04))
#max_depth = 5

cart05 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=5).fit(X_train,y_train)
y_predicted05 = cart05.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted05))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted05))
#max_depth = 6

cart06 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=6).fit(X_train,y_train)
y_predicted06 = cart06.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted06))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted06))
#max_depth = 7

cart07 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=7).fit(X_train,y_train)
y_predicted07 = cart07.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted07))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted07))
#max_depth = 8

cart08 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=8).fit(X_train,y_train)
y_predicted08 = cart08.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted08))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted08))
#max_depth = 9

cart09 = DecisionTreeClassifier(criterion="gini",max_leaf_nodes=6,max_depth=9).fit(X_train,y_train)
y_predicted09 = cart09.predict(X_test)
    
print("[+] confusion matrix\n")
print(confusion_matrix(y_test, y_predicted09))
print("\n[+] classification report\n")
print(classification_report(y_test, y_predicted09))<jupyter_output>[+] confusion matrix

[[29  1]
 [ 0 28]]

[+] classification report

              precision    recall  f1-score   support

         1.0       1.00      0.97      0.98        30
         2.0       0.97      1.00      0.98        28

    accuracy                           0.98        58
   macro avg       0.98      0.98      0.98        58
weighted avg       0.98      0.98      0.98        58<jupyter_text>شرح کد : برای بیش از 4 به 98% دقت رسیده و در هر مورد 1 خطا داشته ایم.   h)<jupyter_code>importance = cart00.feature_importances_
for i,v in enumerate(importance):
    print('Feature %0d (%s) :  Score: %.5f' % (i,X_train.columns[i],v))
    
fig, axes = plt.subplots(1,1,figsize=(10,5))
plt.bar([x for x in X_train.columns], importance)
plt.show()<jupyter_output>Feature 0 (T3_resin) :  Score: 0.00000
Feature 1 (Serum_thyroxin) :  Score: 0.78370
Feature 2 (Serum_triiodothyronine) :  Score: 0.11772
Feature 3 (Basal_TSH) :  Score: 0.01711
Feature 4 (Abs_diff_TSH) :  Score: 0.08148<jupyter_text>شرح کد : Feature Importance به روش هایی گفته می شود که بر حسب اینکه یک متغیر یا فیچر چقدر در پیش بینی متغیر هدف مهم و اثرگدار است به آن یک ارزش داده می شود.در مدل های پیشگو اهمیت بالایی دارد و علاوه بر اینکه در مورد دیتا و مدل به ما دید می دهد مبنای کاهش ابعاد و انتخاب فیچر هم هست. به ما نشان می دهد که کدام فیچر ها به فیچر هدف مرتبط تر هستند و کدام دورتر. در این کار را متخصص بیزینس هم می تواند کمک کند تا بتوانیم داده های مناسب تری هم جمع آوری کنیم. همچنین چون عمدتا این مقدار پس از fit شدن مدل روی داده ها محاسبه می شود دردگاه خوبی هم در مورد مدل ما و فیچرهای مهم برای آن ارائه می دهد.به این صورت ما می توانیم فیچرهایی را که برای مدل ما مهم تر هستند نگه داریم و از بقیه صرف نظر کنیم. هرچه feature_importances_ بالاتر باشد ، ویژگی مهمتر است.به عنوان اهمیت جینی نیز شناخته می شودهمانطور که از اعداد و نمودار فوق مشخص است serum_thyroxin مهم ترین فیچر برای پیش بینی Outcome است و سایر فیچر ها هم به ترتیب مشخض شده اند.  i)<jupyter_code>from sklearn.tree import export_graphviz
import pydotplus
import graphviz
export_graphviz(cart09, out_file="tree.dot", class_names=["Outcome1", "Outcome2"],feature_names=X_train.columns, impurity=True, filled=True)

with open("tree.dot") as f:
    dot_graph = f.read()
graphviz.Source(dot_graph)<jupyter_output><empty_output><jupyter_text>شرح کد : درخت با max_depth=9 به 98درصد دقت می رسد پس آن برای رسم انتخاب شده است.درخت مربوط به آن را در فایلtree.dot با کلاس های متغیر هدف Outcome1و Outcome2 و اسامی فیچرهای معادل نام ستون هایX_train ذخیره کردایم. سپی فایل را خوانده و به کمک همان graphviz درخت را نمایش دادیم. در ادامه نیز به روش دیگری آن را نمایش خواهیم داد.impurity=True باعث نمایش gini در نمودار می شود.  j)<jupyter_code>import collections
from IPython.display import Image  

graph = pydotplus.graph_from_dot_data(dot_graph)
colors = ('turquoise', 'pink')
edges = collections.defaultdict(list)

for edge in graph.get_edge_list():
    edges[edge.get_source()].append(int(edge.get_destination()))

for edge in edges:
    edges[edge].sort()    
    for i in range(2):
        dest = graph.get_node(str(edges[edge][i]))[0]
        dest.set_fillcolor(colors[i])

graph.write_png('mytree.png')
Image(graph.create_png())<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10620689655172413, 'fraction_numerical': 0.03891625615763547, 'mean_word_length': 4.735028248587571, 'pattern_counts': {'":': 0, '<': 40, '<?xml version=': 0, '>': 40, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '32558', 'license': 'MIT', 'n_tokens_mistral': 5425, 'n_tokens_neox': 4621, 'n_words': 1011, 'path': '3/Q5/Q5.ipynb', 'repo_name': 'ellietoulabi/DataMiningCourseHomeworks', 'size': '10150'}